Frage Wie verwende ich Variablen in einem sed-Befehl?


Ich habe versucht den folgenden Code zu ersetzen QQ mit ZZ, aber es macht nicht was ich will:

var1=QQ
sed -i 's/$var1/ZZ/g' $file

Dieser Code macht jedoch, was ich will:

sed -i 's/QQ/ZZ/g' $file

Wie verwende ich Variablen in sed?


178
2017-11-07 16:30


Ursprung


sehen meine Antwort in diesem Post von dir - ata
verbunden: stackoverflow.com/questions/407523/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


Antworten:


Die Shell ist verantwortlich für die Erweiterung von Variablen. Wenn Sie einfache Anführungszeichen für Strings verwenden, wird deren Inhalt wörtlich behandelt sed versucht nun jedes Vorkommen des Literals zu ersetzen $var1 durch ZZ.

Anführungszeichen verwenden

Verwenden Sie doppelte Anführungszeichen, um die Shell beim Erweitern von Whitespaces zu erweitern:

sed -i "s/$var1/ZZ/g" "$file"

Wenn Sie das Anführungszeichen in der Ersetzungszeichenfolge benötigen, müssen Sie ihm einen umgekehrten Schrägstrich voranstellen, der von der Shell interpretiert wird. Im folgenden Beispiel die Zeichenfolge quote me wird ersetzt durch "quote me" (der Charakter & wird interpretiert von sed):

sed -i "s/quote me/\"&\"/" "$file"

Einfache Anführungszeichen verwenden

Wenn Sie viele Shell-Metazeichen haben, sollten Sie einfache Anführungszeichen für das Muster und doppelte Anführungszeichen für die Variable verwenden:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Beachten Sie, wie ich benutze s,pattern,replacement, Anstatt von s/pattern/replacement/Ich habe es getan, um Störungen zu vermeiden / im \0/.

Beispiel

Die Shell führt dann den obigen Befehl aus sed mit den nächsten Argumenten (angenommen pattern=bert und file=text.txt):

-i
s,bert,Say hurrah to &: \0/,
text.txt

Ob file.txt enthält bert, die Ausgabe wird sein:

Say hurrah to bert: \0/

252
2017-11-07 17:20



Wie würde man die "/ g" -Option mit dieser durch Komma getrennten Form übergeben? - blong
@ b.long Es ist ein g Option, so würden Sie weitergeben s,foo,bar,g stattdessen. - Lekensteyn
Ihr Zitat Zitat ist besonders nützlich, deckt sed mit Regex-Muster ziemlich schön! - Brian Thomas
Falls Sie versucht sind zu verwenden \\0 Anstatt von \0sollte es nicht gemacht werden, wenn \0 ist in einfache Anführungszeichen eingeschlossen. Andernfalls sed wird das Muster für ein Literal ersetzen \0 anstelle des ganzen Spiels. - Lekensteyn


Wir können Variablen in verwenden sed doppelte Anführungszeichen verwenden:

sed -i "s/$var/r_str/g" file_name

Wenn Sie einen Schrägstrich haben / In der Variablen verwenden Sie dann ein anderes Trennzeichen, wie unten:

sed -i "s|$var|r_str|g" file_name

78
2017-08-07 15:29