2016-03-31 35 views
0

Ich versuche, eine sed Befehl mit einem sed Befehl zu ersetzen und es fällt immer wieder nach so ein paar Stunden "Streikposten" Ich dachte, ich würde die Frage hier stellen.Ersetzen sed mit sed auf RHEL6.7

Ich habe verschiedene Bash-Skripte, die diese Art von Zeile enthalten:

sed 's/a hard coded server name servername.//' 

Ich mag würde, sie ersetzen mit:

sed "s/a hard coded server name $(hostname).//" 

Notiere die Zugabe von doppelten Anführungszeichen, so dass die $ (hostname) erweitert, was das ein wenig schwieriger macht, als ich erwartet habe.

also war meine erste von vielen Fehlversuchen:

cat file | sed 's!sed \'s\/a hard coded server name servername.\/\/\'!sed \"s\/a hard coded server name $(hostname).\/\/\"!g' 

Ich habe versucht, auch mit dem Ersatz in Teile Option „-e“ ist schön, sed zu brechen, um zu versuchen und die Problembereiche abzielen. Ich würde nicht die „-e“ Schalter in einer Lösung verwenden, aber es ist nützlich, manchmal für das Debuggen:

cat file | sed -e 's!servername!\$\(hostname\)!' -e 's!\| sed \'s!\| sed \"s!' 

Die ersten sed funktioniert wie erwartet (nichts Besonderes passiert hier) und die zweite nicht so keinen Sinn, das Hinzufügen drittens müsste das das schließende Doppelzitat ersetzen.

An diesem Punkt meine Geschichte steigt in Chaos, so dass kein Punkt mehr Fehlversuche hinzufügen.

Ich wollte die erste Ersetzung in einem einzigen Befehl verwenden, da das Skript voll von sed-Befehlen ist und ich nur einen bestimmten Befehl im Skript anvisieren wollte.

Irgendwelche Ideen würden geschätzt.

+2

Sie können einfache Anführungszeichen nicht in einfache Anführungszeichen umwandeln, Sie müssen doppelte Anführungszeichen auf der Außenseite verwenden oder verwenden Sie "" für jedes einzelne Anführungszeichen. Das heißt, ob http://stackoverflow.com/q/29613304/258523 hier eine Hilfe ist. –

+1

Setzen Sie nicht den ganzen sed-Befehl in Anführungszeichen oder Sie müssen sich Sorgen machen, dass sich bei zukünftigen Updates andere Dinge einschleichen. Lösen Sie einfach die einfachen Anführungszeichen für den Teil aus, den die Shell erweitern soll: 'sed 's/a hart codierter Servername' '$ (hostname)' '.// '' –

+0

Ich dachte, ich hätte das einzige Zitat in dem Befehl korrekt gemerkt. Könnten Sie @Etan erweitern? – Chris

Antwort

0

Hier ist, wie Sie es in awk tun könnte, wenn Sie ignorieren (oder Griff) metachars in den alten und neuen Text, wie Sie es mit sed:

$ awk -v old="sed 's/a hard coded server name servername.//'" \ 
     -v new="sed 's/a hard coded server name '\"\$(hostname)\"'.//' \ 
      '{sub(old,new)}1' file 
sed 's/a hard coded server name '"$(hostname)"'.//' 

oder zu vermeiden, mit metachars, beschäftigen verwenden nur Zeichenfolgen für den Vergleich und den Ersatz:

$ awk -v old="sed 's/a hard coded server name servername.//'" \ 
     -v new="sed 's/a hard coded server name '\"\$(hostname)\"'.//'" \ 
      's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))}1' file 
sed 's/a hard coded server name '"$(hostname)"'.//' 
0

Folgen Sie dem Verhalten von Vorlagenwerkzeugen, indem Sie eine Sequenz verwenden, die niemals in der tatsächlichen Verwendung erscheinen und diese ersetzen sollte. Zum Beispiel mit Doppelpunkten, nur weil sie weniger zu zitieren:

#!/bin/bash 
sed "s/:servername:/$(hostname)/g" <<EOF > my_new_script.bash 
    echo "This is :servername:" 
EOF 

I echo im internen Skript zum Zweck der Klarheit verwendet habe.

sed 's/complex substitution :servername:/inside quotes :servername:/' 

die zitierte Ärger vermeidet, weil die äußere sed die hier Dokument als Klartext behandelt: Man könnte ebenso etwas wie verwendet haben.