2016-05-25 3 views
1

Ich schrieb dieses Shell-Skript.Warum schneidet der Bearbeitungsbefehl 's' die Datei ab, anstatt sie anzuhängen?

echo a: foo > a.txt 
echo a: bar >> a.txt 
echo a: baz >> a.txt 

sed -i -e '/bar/{ w b.txt' -e 'd }' a.txt 
sed -i -e '/baz/{ w b.txt' -e 'd }' a.txt 

cat b.txt 

Hier ist der Ausgang, den ich bekam.

a: baz 

Aber ich habe diese Ausgabe erwartet.

a: bar 
a: baz 

erwartete ich diese Ausgabe, weil http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html sagt:

[2addr]w wfile 
    Append (write) the pattern space to wfile. 

Da es sagt „anhängen“, war ich davon aus, dass der erste sed Befehl a: bar auf eine nicht vorhandene Datei anhängen würde, so zu schaffen, dass Datei. Dann würde der zweite sed Befehl a: baz an die gleiche Datei anhängen.

Aber die obige Ausgabe zeigt, dass dies nicht der Fall war.

Was ist falsch in meinem Verständnis?

Antwort

0

Alle Schreibbefehle eines einzelnen Sed-Aufrufs hängen an dieselbe Datei an. Bei jedem neuen Aufruf wird die Datei jedoch zuerst abgeschnitten.

2

Sie führen sed zweimal aus, und der erste (und einzige) Aufruf an w jedes Mal schneidet die Datei ab. Um Ihre erwartete Ausgabe, müssen Sie nur einmal sed laufen:

$ sed -i -e '/bar/{ w b.txt' -e 'd }' -e '/baz/{ w b.txt' -e 'd }' a.txt 
$ cat b.txt 
a: bar 
a: baz 

Oder mit weniger -e:

sed -i '/bar\|baz/{ 
    w b.txt 
    d 
    }' a.txt 

Makel mit \| ist eine GNU-Erweiterung zu grundlegenden regulären Ausdrücken, nur wie -i ist auch nicht Teil von POSIX sed.

Verwandte Themen