anoniem Geplaatst: 23 juni 2003 Delen Geplaatst: 23 juni 2003 Éé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? Quote Link naar reactie
anoniem Geplaatst: 23 juni 2003 Auteur Delen Geplaatst: 23 juni 2003 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) Quote Link naar reactie
anoniem Geplaatst: 23 juni 2003 Auteur Delen Geplaatst: 23 juni 2003 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 .... Quote Link naar reactie
anoniem Geplaatst: 24 juni 2003 Auteur Delen Geplaatst: 24 juni 2003 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] Quote Link naar reactie
anoniem Geplaatst: 24 juni 2003 Auteur Delen Geplaatst: 24 juni 2003 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? Quote Link naar reactie
anoniem Geplaatst: 25 juni 2003 Auteur Delen Geplaatst: 25 juni 2003 gebruik je wel de linefeed in de string? Dus precies zoals hierboven staat? Elk s|...|...| commando moet nl. op een nieuwe regel komen. Quote Link naar reactie
anoniem Geplaatst: 25 juni 2003 Auteur Delen Geplaatst: 25 juni 2003 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! Quote Link naar reactie
anoniem Geplaatst: 25 juni 2003 Auteur Delen Geplaatst: 25 juni 2003 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). Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen