2017-03-09 1 views
1

Ich habe dieses Thema durchsucht und einige Beispiele gesehen, aber irgendwie funktioniert es nicht für mich. Ich muss eine Zeile durch eine andere Datei in Shell-Skript ersetzen (die Dateipfad und Erweiterung enthält). Ich benutze unten Befehl, aber ersetzen funktioniert nicht.Shell: Ignoriere Escape-Sequenzen beim Ersetzen eines Patterns

line='a|b|c|\\folder\file.txt' 
upd_line='a|b|c|\\folder\file.txt|d' 
sed -i 's#$line#$upd_line#g' sample.txt 

sample.txt Inhalt:

HDR|date 

a|b|c|\\folder\file.txt 

Ich zweite Linie erwarten mit Inhalt von upd_line $ ersetzt werden, aber es bleibt unverändert. Bitte rate mir, was ich falsch mache. Ich habe versucht in Bash und Ksh ohne Glück.

Antwort

2

Dies könnte für Sie arbeiten (GNU sed & bash):

a='a|b|c|\\folder\file.txt' 
b='a|b|c|\folder\file.txt|d' 

qs(){ sed <<<$1 's/[][\\.*^$]/\\&/g';} 

sed "s/$(qs $a)/$(qs $b)/" file 

Diese Funktion qs erzeugt, die die variable Strings die konvertiert akzeptierte form in der sed regexp und ersatz.

N.B. die Verwendung von Anführungszeichen um den Befehl sed; Dadurch kann die Shell die Shell-Variablen und Funktionsaufrufe interpolieren. Wenn GNU readline bei der Wahl des Terminals verwendet wird, zeigt C-M-e Ihnen die Ergebnisse der Interpolation an, bevor die Shell den Befehl sed ausführt (Sie müssen die Ergebnisse möglicherweise erneut anfordern, bevor Sie sie real ausführen).

+0

Das funktioniert .. vielen Dank – Karthik

2

Es wird so etwas wie dieses:

line="a|b|c|\\\\\\\folder\\\file.txt" 
sed -i "s#$line#&|d#g" sample.txt 

Ausgang:

HDR|date 

a|b|c|\\folder\file.txt|d 
+0

Leider ist die Zeile aus einer Datei Inhalt und ich könnte nicht in der Lage sein, das zu ändern – Karthik

1

perl besser mit quote operators

$ cat sample.txt 
HDR|date  
a|b|c|\\folder\file.txt 

$ # adding |d to end of line 
$ line='a|b|c|\\folder\file.txt' 
$ perl -pe "s/$/|d/ if /\Q$line/" sample.txt 
HDR|date  
a|b|c|\\folder\file.txt|d 

$ # generic search and replace 
$ l='a|b|c|\\folder\file.txt' ul='a|b|c|\\folder\file.txt|d' perl -pe 's/\Q$ENV{l}/$ENV{ul}/' sample.txt 
HDR|date  
a|b|c|\\folder\file.txt|d 
geeignet wäre