2016-07-25 9 views
0

Ich verwende sed in einem Shell-Skript, um ein Wort in einer Datei durch einen Satz zu ersetzen, der in einer Shell-Variablen gespeichert ist. Der Satz enthält Leerzeichen und verschiedene Zeichen.Space interferiert beim Ersetzen von sed mit Shell-Variablen

Ex:

sentence="new number is > than 2.5 and < than 3.8" 
sed "s|word|$sentence|g" -i Example_file.txt 

Zeile in der Datei:

tile = "word - Final plot" 

erwartetes Ergebnis:

title = "new number is > than 2.5 and < than 3.8 - Final plot" 

erhaltene Ergebnis:

title = "new - Final plot" 

Wie Sie oben sehen können, ist das Problem, dass sed "Wort" immer nur durch das erste Wort des Satzes ersetzt, es stoppt bei dem Leerzeichen. Ich habe verschiedene Varianten des Befehls ausprobiert:

sed 's|word|'"$sentence"'|g' -i Example_file.txt 
sed "s|word|${sentence}|g" -i Example_file.txt 

Nichts davon scheint zu funktionieren. Um zu überprüfen, ob die Leerzeichen tatsächlich das Problem waren, habe ich sie durch "_" ersetzt, und wenn ich das tue, ersetzt sed den ganzen Satz.

Wer weiß, wie kann ich sed zwingen, die Räume zu nehmen und den ganzen Satz zu benutzen?

+1

Dies ist sehr schwer zu lesen. Bitte verwenden Sie die Schaltfläche "Code-Formatierung", um Ihren Code/Ihre Befehlszeilen zu formatieren. Es ist ein einziger Klick! –

+0

Danke Inian für die Änderung! – Inacio

+1

Verwenden Sie 'GNU' sed ?. Funktioniert gut auf 'GNU sed Version 4.2.1' – Inian

Antwort

0

Versuchen Sie dies, bezogen auf Festsetzung, was ich Ihren Kommentar unter Ihrer Frage THINK sagt uns, die Sie gerade tun:

file1:

#!/bin/sh 
sed 's/\<word\>/'"$1"'/' abc.txt 

file2:

#!/bin/sh 
sentence="new number is > than 2.5 and < than 3.8" 
./file1 "$sentence" 

Google " zitieren Sie Ihre Shell-Variablen ". Das obige nimmt an, dass Sie GNU sed für Wortgrenzen \<...\> haben. Wenn du sie dann nicht loswirst, um zu sehen, ob es funktioniert, können wir darüber sprechen, wie du die Notwendigkeit für sie in anderen sds adressierst.

+1

Ich habe tatsächlich die Shell-Variable nicht zitiert. Der Code enthielt auch eine Variable ohne Leerzeichen, und da sie für diejenigen arbeitete, von denen ich annahm, dass sie auch für die mit Platz arbeiten würde. Vielen Dank für deine Antwort, es hat mein Problem gelöst. – Inacio