2016-11-20 2 views
1

ich ein Skript, das mit beginnt: istSuche Linie variable Zeichenkette verwenden, ersetzt ganze Linie mit einer anderen Linie von verschachtelter Schleife erzeugt

sed 's!'$1'!'$2'!g' file.txt > new.txt ; 

$ 1 und $ 2 sind variabel und ein dritte Variable $ 3 später im Skript verwendet wird das Skript in diesem Format ausgeführt:

./script.sh variable variable2 variable3 

der nächste Teil des Skripts in eine Textdatei, die dritte Variable fügt hinzu:

sed "s!><!> $3 <!4" newer.txt > newest.txt 

Was ich jetzt tun möchte, ist die Ausgabe von "nearest.txt" (das ist eine Zeile und enthält Zeichen wie/<> "/ wie es in HTML ist) und ersetzen Sie eine Zeile in einer anderen Datei, die mit Variable2 als identifiziert wird das Match.

Dies ist, was ich habe, aber es scheint nicht die ganze Linie zu ersetzen, nur Teil.

Ich bin auf Solaris, die die Option -i bei Verwendung von sed nicht zulassen. Sed, Awk oder Bash wäre vorzuziehen.

Vielen Dank im Voraus!

+0

Wie wäre es mit einigen Beispieldaten und erwartete Ausgabe? –

Antwort

2

r Befehl verwenden lesen aus einer Datei robust sein, da es nicht auf dem Inhalt der Datei oder mehrzeilige Dateieingabe

sed -e "/$2/r newest.txt" -e "/$2/d" new.txt > final.txt 

oder

sed -e "/$2/r newest.txt" -e '//d' new.txt > final.txt 

Dank @ mklement0 Pause basiert wird zum Hinweis, dass der Inhalt des Ersatzes das Ergebnis beeinflussen kann und dass wir das Muster für d wiederverwenden können Befehl:


über die verschiedenen Fälle:

$ cat ip.txt 
foo 
bar 
baz 
123 

$ s='ba' 
$ echo 'XYZ' > f1 
$ r=$(<f1) 

$ sed "/$s/s/.*/$r/" ip.txt 
foo 
XYZ 
XYZ 
123 

$ sed "/$s/c$r" ip.txt 
foo 
XYZ 
XYZ 
123 

$ sed -e "/$s/r f1" -e '//d' ip.txt 
foo 
XYZ 
XYZ 
123 

Wenn Ersatz-String Zeichen wie /

$ echo '/XYZ/' > f1 
$ r=$(<f1) 

$ sed "/$s/s/.*/$r/" ip.txt 
sed: -e expression #1, char 11: unknown option to `s' 

$ sed "/$s/c$r" ip.txt 
foo 
/XYZ/ 
/XYZ/ 
123 

$ sed -e "/$s/r f1" -e '//d' ip.txt 
foo 
/XYZ/ 
/XYZ/ 
123 

Und für mehrzeilige enthält:

$ echo -e 'XYZ\nABC' > f1 
$ r=$(<f1) 

$ sed "/$s/s/.*/$r/" ip.txt 
sed: -e expression #1, char 12: unterminated `s' command 

$ sed "/$s/c$r" ip.txt 
sed: -e expression #1, char 10: unknown command: `A' 

$ sed -e "/$s/r f1" -e '//d' ip.txt 
foo 
XYZ 
ABC 
XYZ 
ABC 
123 

Hinweis: Einige sed Versionen könnten sed "/$s/c\\$r" ip.txt müssen, wo c\ ist die Verwendung von c Befehl. Innerhalb doppelte Anführungszeichen \ muss escaped sein

+1

Vielen Dank Sundeep, hat ein Vergnügen gemacht! :) – rickyboy