Vraag & Antwoord

OS Linux

[sed] Wie weet een elegante oplossing?

8 antwoorden
  • Éé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?
  • de hele ${...} constructie tussen dubbele aanhalingstekens zetten:[code:1:c6bf6abec8]sed -e "${STRING_GEVULD_DOOR_EEN_LOOP_VAN_EEN_FUNCTIE}" $MAKEFILE_IN > $MAKEFILE_OUT[/code:1:c6bf6abec8](en ff een onnodige kat eruit gehaald)
  • 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 ....
  • 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]
  • hmm .. dat levert op[code:1:7c7662acdd]sed: -e expression #1, char 48: Unknown option to `s'[/code:1:7c7662acdd]We zoeken nog even verder ... Tja, het betere is de vijand van het goede, toch?
  • gebruik je wel de linefeed in de string? Dus precies zoals hierboven staat? Elk s|...|...| commando moet nl. op een nieuwe regel komen.
  • 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!
  • 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).

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.