2016-07-20 15 views
1

Entschuldigung, wenn sich herausstellt, dass dies eine dumme Frage ist, aber ich bin nur verloren, was mit meinem sed-Befehl falsch sein könnte.sed arbeitet für einen hartcodierten Dateinamen, aber nicht für eine Variable, die den Dateinamen enthält

Dies ist die gesamte Befehle, die ich habe:

file="hello_world.cpp" 
grep -lrI "$file" dir/ | xargs sed -i 's/\(\$file\)/\1\.bin/' 

Grundsätzlich für jede Datei, die ich bin auf der Suche, die die Zeichenfolge „hello_world.cpp“ enthält, dann in sed Bestehen der Erweiterung .bin an die anhängen string (Ja, das macht vielleicht keinen Sinn, aber ich benutze nur ein generisches Beispiel. Ich brauche diese spezifische Funktionalität für das, woran ich gerade arbeite).

Das Problem, das ich habe, ist, dass, während die Grep und String-Zuweisung wie erwartet funktioniert, der Befehl sed ist nicht. Was mich noch mehr verwirrt, ist, dass dieser folgende Befehl funktioniert.

grep -lrI "$file" dir/ | xargs sed -i 's/\(hello_world.cpp\)/\1\.bin/' 

Dies ersetzt die Zeichenfolge „hello_world.cpp“ mit „hello_world.cpp.bin“ innerhalb aller Dateien, die die Zeichenfolge „hello_world.cpp“ enthalten, das ist genau, wie ich es möchte.

Wenn jemand helfen könnte, meinen Fehler aufzuzeigen, würde es sehr geschätzt werden. Vielen Dank.

+1

Verwenden Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen in sed bei der Verwendung von Shell-Variablen – anubhava

+1

Verdammt, ich wusste, dass es etwas Einfaches war. Vielen Dank. Würde es Ihnen etwas ausmachen, Ihren Kommentar in den Antwortbereich zu verschieben, damit ich ihn als Antwort markieren kann? –

Antwort

1

Problem ist hier:

xargs sed -i 's/\(\$file\)/\1\.bin/' 

Da Sie Shell-Variable in einfache Anführungszeichen verwenden, wo es expandiert bekommen nicht.

können Sie doppelte Anführungszeichen verwenden, um es zu erweitern:

xargs sed -i "s/$file/&.bin/" 

Beachten Sie auch, dass es keine Notwendigkeit Capture-Gruppe zu verwenden, wie Sie & Ersatz verwenden können.

Verwandte Themen