2017-02-03 6 views
0

Ich versuche, eine Shell-Skript zu verstehen, die den Befehl unten verwendet:sed Befehl mit Dollar

sed '$d;1,2 d;s/^ //' $file1 > $file2 

I s/^ // gemustert wird die Leerzeilen zu befreien, kann aber nicht erkennen, was die $d;1,2 d; tut. Kann mir bitte jemand erklären?

+0

Streng genommen eliminiert der 's/^ //' Teil ein führendes Leerzeichen aus jeder Zeile, das mit einem Leerzeichen beginnt. Das ist nicht das Gleiche wie das Löschen von Leerzeilen. Das würde mit '/^[[: blank:]] * $/d' oder einem äquivalenten Befehl geschehen. –

+0

Im Zweifel, und es gibt keine Zeit zu fragen, manchmal hilft es, einige bekannte Daten durch Mystery-Code zu laufen, nur um zu sehen, was passiert. Piping in einer Liste von Zahlen, wie 'seq 10 | sed '$ d; 1,2 d''hätte da geholfen, der Output wäre * 3 * bis * 9 *. – agc

+0

Mögliches Duplikat von [wie man Dollarzeichen ($) in sed-Skriptprogrammierung versteht?] (Http://stackoverflow.com/questions/29224326/how-to-understand-dollar-sign-in-sed-script-programming) –

Antwort

4

Dies löscht die letzte Zeile der Datei und die ersten beiden Zeilen.

Der Befehl sed 'd' elete erwartet ein oder zwei Argumente. Wenn eins, dann wird das Löschen für diese Zeile passieren; Wenn zwei, dann wird das Löschen von der Zeile, die dem ersten Argument entspricht, durch die Zeile geschehen, die der zweiten entspricht. Die Argumente können reguläre Ausdrücke oder Zeilennummern sein. sed erkennt auch $ für die letzte Zeile.

So löscht die $d die letzte Zeile. und 1,2d löscht die 1. bis 2. Zeile.

Siehe man sed für alle blutigen Details.

+0

Vielen Dank für die Erklärung! – user1318369

+0

'info sed' für ** aaaaaall ** die blutigen Details;) –