it-swarm.com.de

Wie vermeide ich doppelte und einfache Anführungszeichen in sed?

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?

57
KRB

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.

70
Kusalananda

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

21
tony duan

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
10
glenn jackman

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

8
Denis

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!

0
Victoria Stuart
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%
0
SachinH