Soweit ich feststellen kann, wird bei Verwendung von einfachen Anführungszeichen alles im Inneren als wörtlich betrachtet. Ich möchte das für meine Ersetzung. Ich möchte aber auch eine Zeichenfolge mit einfachen oder doppelten Anführungszeichen finden.
Zum Beispiel,
sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'
Ich möchte "http://www.fubar.com" durch URL_FUBAR ersetzen. Wie soll sed meine // oder meine doppelten Anführungszeichen erkennen?
Vielen Dank für jede Hilfe!
EDIT: Könnte ich verwenden s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g
?
Entkommt \ tatsächlich Zeichen in den einfachen Anführungszeichen?
quelle
sed 's/"/bla/g'
ersetzen"
durchbla
odersed "s/'/bla/g" to replace
'`mitbla
"'"
(einem einfachen Anführungszeichen in doppelten Anführungszeichen) zu verketten, bevor Sie mit dem Rest der Zeichenfolge in einfachen Anführungszeichen fortfahren, wie in'you'"'"'d better do that'
.Informationen zum einfachen Anführungszeichen finden Sie im folgenden Code, mit dem die Zeichenfolge ersetzt wird
let's
durchlet us
:Befehl:
echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
Ergebnis:
quelle
Es ist schwer, einem einfachen Anführungszeichen in einfachen Anführungszeichen zu entkommen. Versuche dies:
sed "s@['\"]http://www.\([^.]\+).com['\"]@URL_\U\1@g"
Beispiel:
$ sed "s@['\"]http://www.\([^.]\+\).com['\"]@URL_\U\1@g" <<END this is "http://www.fubar.com" and 'http://www.example.com' here END
produziert
quelle
Mein Problem war, dass ich das
""
Äußere des Ausdrucks haben musste, da ich eine dynamische Variable innerhalb des sed-Ausdrucks selbst habe. Die eigentliche Lösung ist also die von Lenn Jackman, durch die Sie das"
Innere des Sed Regex ersetzen[\"]
.Meine komplette Bash ist also:
RELEASE_VERSION="0.6.6" sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml
Hier ist:
#
ist der sed Separator[\"]
="
in Regexvalue =
\"tags/$RELEASE_VERSION\"
= meine Ersatzzeichenfolge, wichtig, dass sie nur\"
die Anführungszeichen enthältquelle
Das Entkommen eines doppelten Anführungszeichens kann in sed unbedingt erforderlich sein: Zum Beispiel, wenn Sie doppelte Anführungszeichen im gesamten sed-Ausdruck verwenden (wie Sie es tun müssen, wenn Sie eine Shell-Variable verwenden möchten).
Hier ist ein Beispiel, das die Flucht in sed berührt, aber auch einige andere Zitierprobleme in bash erfasst:
# cat inventory PURCHASED="2014-09-01" SITE="Atlanta" LOCATION="Room 154"
Angenommen, Sie wollten den Raum mithilfe eines sed-Skripts ändern, das Sie immer wieder verwenden können, sodass Sie die Eingabe wie folgt variieren können:
# i="Room 101" (these quotes are there so the variable can contains spaces)
Dieses Skript fügt die gesamte Zeile hinzu, wenn sie nicht vorhanden ist, oder ersetzt einfach (mit sed) die vorhandene Zeile durch den Text plus den Wert von $ i.
if grep -q LOCATION inventory; then ## The sed expression is double quoted to allow for variable expansion; ## the literal quotes are both escaped with \ sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory ## Note the three layers of quotes to get echo to expand the variable ## AND insert the literal quotes else echo LOCATION='"'$i'"' >> inventory fi
PS Ich habe das obige Skript in mehreren Zeilen geschrieben, um die Kommentare analysierbar zu machen, aber ich verwende es als Einzeiler in der Befehlszeile, die so aussieht:
i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi
quelle
Nebenbei: sed-Ausdrücke, die BASH-Variablen enthalten, müssen doppelt (
"
) in Anführungszeichen gesetzt werden, damit die Variable korrekt interpretiert wird.Wenn Sie auch Ihre $ BASH-Variable in doppelte Anführungszeichen setzen (empfohlene Vorgehensweise)
... dann können Sie den variablen doppelten Anführungszeichen wie gezeigt entkommen:
sed -i "s/foo/bar ""$VARIABLE""/g" <file>
Dh, ersetzen Sie das $ VARIABLE-assoziierte
"
mit""
.(Einfach -scaping
"$VAR"
als\"$VAR\"
Ergebnis in einer"
-quotierten Ausgabezeichenfolge.)Beispiele
$ VAR='apples and bananas' $ echo $VAR apples and bananas $ echo "$VAR" apples and bananas $ printf 'I like %s!\n' $VAR I like apples! I like and! I like bananas! $ printf 'I like %s!\n' "$VAR" I like apples and bananas!
Hier wird $ VAR vor der
"
Weiterleitung an sed angegeben (sed ist entweder'
- oder"
angegeben):$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g' I like apples and bananas! $ printf 'I like %s!\n' "$VAR" | sed 's/"$VAR"/cherries/g' I like apples and bananas! $ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g' I like apples and bananas! $ printf 'I like %s!\n' "$VAR" | sed 's/""$VAR""/cherries/g' I like apples and bananas! $ printf 'I like %s!\n' "$VAR" | sed "s/$VAR/cherries/g" I like cherries! $ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g" I like cherries!
Vergleichen Sie das mit:
$ printf 'I like %s!\n' $VAR | sed "s/$VAR/cherries/g" I like apples! I like and! I like bananas! $ printf 'I like %s!\n' $VAR | sed "s/""$VAR""/cherries/g" I like apples! I like and! I like bananas!
... und so weiter ...
Fazit
Meine Empfehlung lautet standardmäßig:
"
-quote BASH-Variablen ("$VAR"
)"
-quote wiederum diese Variablen (""$VAR""
), wenn sie in einem sed-Ausdruck verwendet werden (der selbst"
-quoted, nicht'
-quoted sein muss)$ VAR='apples and bananas' $ echo "$VAR" apples and bananas $ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g" I like cherries!
quelle
Prompt% cat t1 This is "Unix" This is "Unix sed" Prompt% sed -i 's/\"Unix\"/\"Linux\"/g' t1 Prompt% sed -i 's/\"Unix sed\"/\"Linux SED\"/g' t1 Prompt% cat t1 This is "Linux" This is "Linux SED" Prompt%
quelle
Sie können% verwenden
sed -i "s%http://www.fubar.com%URL_FUBAR%g"
quelle
Sie müssen das Zeichen "zum Escape" verwenden (\ das folgende Zeichen maskieren)
sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'
quelle
Kann das "\" Zeichen sein, versuchen Sie dieses:
sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'
quelle