Ga naar inhoud

[sed] Wie weet een elegante oplossing?


Aanbevolen berichten

Één van de voordelen van vrije software is dat je zelf het wiel opnieuw kan uitvinden, toch? In dat kader het volgende:[code:1:a0374cb484]cat $MAKEFILE_IN | sed -e "s|${SEARCH[0]}|${REPLACE[0]}|" \ -e "s|${SEARCH[1]}|${REPLACE[1]}|" -e "s|${SEARCH[2]}|${REPLACE[2]}|" \ -e "s|${SEARCH[3]}|${REPLACE[3]}|" -e "s|${SEARCH[4]}|${REPLACE[4]}|" \ -e "s|${SEARCH[5]}|${REPLACE[5]}|" -e "s|${SEARCH[6]}|${REPLACE[6]}|" \ -e "s|${SEARCH[7]}|${REPLACE[7]}|" -e "s|${SEARCH[8]}|${REPLACE[8]}|" \ -e "s|${SEARCH[9]}|${REPLACE[9]}|" -e "s|${SEARCH[10]}|${REPLACE[10]}|" > $MAKEFILE_OUT[/code:1:a0374cb484]Deze [i:a0374cb484]codesnippet[/i:a0374cb484] komt uit een configurescript van eigen makelij. (Ik gebruik daarbij "|" als scheidingstekens om te zorgen dat ik zonder al te veel problemen padnamen (dus met één of meer keer erin "/" ) kan voeren aan sed.) Deze lange regel is echter de enige manier waarop ik ook spaties kan voeren aan sed in de diverse REPLACE strings. Dit werkt allemaal prima, maar eleganter, en makkelijker te onderhouden, zou natuurlijk zijn iets als [code:1:a0374cb484]cat $MAKEFILE_IN | sed ${STRING_GEVULD_DOOR_EEN_LOOP_VAN_EEN_FUNCTIE} > $MAKEFILE_OUT[/code:1:a0374cb484]maar ik krijg op die manier met geen mogelijkheid spaties gevoerd aan sed. Iemand een idee voor dit, erg weinig urgente, schoonheidsfoutje?
Link naar reactie
Dank voor de reactie. Ik gebruik nu in het kort[code:1:fc8e82c8e9]search_replace () { index=0 SEARCHANDREPLACE="" for z in ${SEARCH[*]}; do SEARCHANDREPLACE="$SEARCHANDREPLACE -e \"s|${SEARCH[$index]}|${REPLACE[$index]}|\"" let "index += 1" done } search_replace cat $MAKEFILE_IN | sed "${SEARCHANDREPLACE}" > $MAKEFILE_OUT[/code:1:fc8e82c8e9]Resultaat[code:1:fc8e82c8e9]sed: -e expression #1, char 2: Unknown command: `-'[/code:1:fc8e82c8e9]Tja ....
Link naar reactie
je moet de -e uit het script halen, die string moet gewoon 1 geldig sedscript zijn, de losse -e's hoeven er niet tussen: [code:1:3ae63ec988] search_replace () { index=0 SEARCHANDREPLACE="" for z in ${SEARCH[*]}; do SEARCHANDREPLACE="$SEARCHANDREPLACE s|${SEARCH[$index]}|${REPLACE[$index]}|" let "index += 1" done } search_replace sed "${SEARCHANDREPLACE}" $MAKEFILE_IN > $MAKEFILE_OUT [/code:1:3ae63ec988]
Link naar reactie
Bingo! 'k Snap het nog niet (hoe kan die linefeed nou een rol spelen?) maar't werkt. 'k Snap trouwens ook niet waarom het[code:1:19445a6b29]sed "${SEARCHANDREPLACE}" $MAKEFILE_IN > $MAKEFILE_OUT[/code:1:19445a6b29]moet zijn en niet[code:1:19445a6b29]sed "${SEARCHANDREPLACE}" $MAKEFILE_IN $MAKEFILE_OUT[/code:1:19445a6b29]maar goed ... reuze bedankt voor het meedenken!
Link naar reactie
die linefeed is onderdeel van de string. een sed-script is regelgeoriënteerd, dus vandaar dat die linefeeds erin moeten. Lees maar eens een boek over sed of een tootorial ergens op internet :-) de tweede vraag: sed kan meerdere files verwachten op de commandoregel. De uitvoer gaat altijd naar de standaard uitvoer; de shell kan die dus met > omleiden naar een bestand. Maar met de -i optie in sommige sed implementaties kun je de uitvoer terugzetten in de originele files, zelfs met een backup. Lees daarvoor de sed infopage (als je GNU sed gebruikt, wat ik vermoed).
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...