3 Stimmen

Finden und ersetzen Sie Variablen, die nicht maskierte Zeichen enthalten, mit sed.

Ich kann dies verwenden, um alle Vorkommen von "fly" zu finden und in meiner Datei durch "insect" zu ersetzen:

sed -i 's/fly/insect/g' ./animals.txt

Wie kann ich eine BASH-Variable finden und durch eine andere BASH-Variable ersetzen? z. B.:

name=$(echo "fly")
category=$(echo "insect")
sed -i 's/$name/$category/g' ./animals.txt

Aktualisierung:

Ich verwende GNU sed Version 4.2.1. Wenn ich die untenstehenden Lösungen versuche, wird dieser Fehler gemeldet:

sed: -e expression #1, char 73: unknown option to `s'

Aktualisierung:

Ich habe entdeckt, warum der Fehler auftritt. $category enthält häufig viele Symbole (z. B. "/", "$", "@", "!", Klammern usw.).

name=$(echo "fly")
category=$(echo "in/sect")
sed -i "s/$name/$category/g" ./animals.txt

Der obige Code wird denselben Fehler erzeugen:

sed: -e expression #1, char 7: unknown option to `s'

Gibt es eine Möglichkeit, dass sed die Ersatzvorgänge trotz dieser Symbole abschließt?

5voto

jaypal singh Punkte 70917

Verwenden von Anführungszeichen

Verwenden Sie doppelte Anführungszeichen, um die Shell-Variablen zu erweitern und dabei Leerzeichen beizubehalten:

sed -i "s/$name/$category/g" ./animals.txt

Hinweis: Wenn Sie Rückwärtsschrägstriche in Ihren Ersatz einfügen müssen (z. B. für Rückverweise), benötigen Sie doppelte Schrägstriche (\& enthält das Muster):

Verwendung von einfachen Anführungszeichen

Wenn Sie viele Shell-Meta-Zeichen haben, können Sie etwas wie folgt tun:

sed -i 's/'$pattern'/'$category'/g' ./animals.txt

Ich habe entdeckt, warum der Fehler auftritt. $category enthält häufig viele Symbole (z. B. "/", "$", "@", "!", Klammern, usw.).

Wenn der Ersatzteil oder der Ersatz Zeichen wie / enthält, können wir verschiedene Sets von sed-Trennzeichen verwenden. Sie können etwas wie - @ % , ; : | _ etc. jedes Zeichen verwenden, das nicht zufällig in Ihrer Substitution und Ersetzung vorkommt.

3voto

rkb Punkte 3332

Verwenden Sie doppelte Anführungszeichen, damit die Shell Ihre Variablen interpolieren kann:

sed -i "s/$name/$category/g" ./animals.txt

2voto

Sjoerd Punkte 71416

Verwenden Sie doppelte Anführungszeichen:

sed -i "s/$name/$category/g" ./animals.txt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X