Nach allem, was ich finden kann, wenn Sie einfache Anführungszeichen verwenden, wird alles darin als wörtlich betrachtet. Ich möchte das als Ersatz. Ich möchte aber auch eine Zeichenfolge finden, die einfache oder doppelte Anführungszeichen enthält.
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?
Danke für jede Hilfe!
EDIT: Könnte ich s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g
verwenden?
Entkommt\tatsächlich Zeichen innerhalb der einfachen Anführungszeichen?
Mit dem Befehl sed
können Sie anstelle von /
andere Zeichen als Trennzeichen in seinem Befehl s
verwenden:
sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
Die Anführungszeichen sind kein Problem. Wechseln Sie zum Anpassen von einfachen Anführungszeichen zwischen den beiden Anführungszeichen. Beachten Sie, dass eine einzelne Zeichenfolge in Anführungszeichen keine einfachen Anführungszeichen (auch nicht mit Escapezeichen) enthalten darf.
Die Punkte müssen mit einem Escapezeichen versehen werden, wenn sed
sie als Punkte interpretieren soll und nicht als Muster für einen regulären Ausdruck .
, der einem beliebigen Zeichen entspricht.
Beziehen Sie sich auf das einfache Anführungszeichen, um den String let's
durch let us
zu ersetzen:
befehl:
echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
ergebnis:
hallo, lass uns gehen
Es ist schwer, ein einzelnes Zitat innerhalb einzelner Anführungszeichen zu vermeiden. Versuche dies:
sed "[email protected]['\"]http://www.\([^.]\+).com['\"]@URL_\U\[email protected]"
Beispiel:
$ sed "[email protected]['\"]http://www.\([^.]\+\).com['\"]@URL_\U\[email protected]" <<END
this is "http://www.fubar.com" and 'http://www.example.com' here
END
produziert
this is URL_FUBAR and URL_EXAMPLE here
Mein Problem war, dass ich den ""
außerhalb des Ausdrucks haben musste, da ich eine dynamische Variable im sed-Ausdruck selbst habe. Die eigentliche Lösung ist also, dass man von lenn jackman den "
im sed regex durch [\"]
ersetzt.
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 Regex
value = \"tags/$RELEASE_VERSION\"
= meine Ersatzzeichenfolge, wichtig ist, dass es nur den \"
für die Anführungszeichen gibt
Das Beenden eines doppelten Anführungszeichens kann in sed unbedingt erforderlich sein: Zum Beispiel, wenn Sie im gesamten sed-Ausdruck doppelte Anführungszeichen verwenden (wie Sie dies bei der Verwendung einer Shell-Variablen tun müssen).
Hier ein Beispiel, bei dem es darum geht, in sed zu entkommen, aber auch einige andere Zitatprobleme in bash einfängt:
# 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 es nicht vorhanden ist, oder es ersetzt einfach (mithilfe von 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
P.S. Ich habe das Skript in mehreren Zeilen geschrieben, um die Kommentare parsbar zu machen, aber ich benutze es als Einzeiler in der Befehlszeile, der so aussieht:
i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi
Abgesehen davon: sed-Ausdrücke, die BASH-Variablen enthalten, müssen doppelt ("
) angegeben werden, damit die Variable richtig interpretiert wird.
Wenn Sie auch Ihre $ BASH-Variable in doppelte Anführungszeichen setzen (empfohlene Vorgehensweise)
... dann können Sie die variablen Anführungszeichen wie folgt umgehen:
sed -i "s/foo/bar ""$VARIABLE""/g" <file>
Ersetzen Sie also den mit $ VARIABLE zusammenhängenden "
durch ""
.
(Durch einfaches -escaping von "$VAR"
als \"$VAR\"
wird eine in "
zitierte Ausgabezeichenfolge erstellt.)
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:
"
- BASH-Variablen zitieren ("$VAR"
)"
- zitiere, wieder, diese Variablen (""$VAR""
), wenn sie in einem sed-Ausdruck verwendet werden (der selbst "
- zitiert sein muss, nicht '
- zitiert)$ VAR='apples and bananas'
$ echo "$VAR"
apples and bananas
$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!
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%