2016-12-04 2 views
3
sed 'N; D' testfile 

testdat Arbeits enthält:'N' und 'D' nicht wie erwartet mit sed

this is the first line 
this is the second line 
this is the third line 
this is the fourth line 

ich verwende RHEL 6 und der Ausgang kommt wie:

this is the fourth line 

Wie pro meine Verstehen, N zieht nur die nächste Zeile in den Musterbereich und löscht nur die erste Zeile des Musterbereichs. Daher sollte der Ausgang gewesen sein:

Kann jemand bitte erklären, warum der Ausgang wie oben erwähnt kommt?

Antwort

4

Nach the documentation:

D

Wenn Musterraum kein Newline enthält, einen normalen neuen Zyklus beginnen, als ob der d-Befehl ausgegeben wurde. Andernfalls löschen Sie den Text im Musterbereich bis zur ersten neuen Zeile und starten Sie den Zyklus mit dem resultierenden Musterbereich neu, ohne eine neue Eingabezeile zu lesen.

(Hervorhebung von mir.)

Es klingt wie dies würde Ihr sed Programm von Anfang an neu zu starten, Lesen und Löschen von Zeilen, bis es aus Eingangs läuft, an welcher Stelle nur die letzte Zeile in der linken Puffer.

+0

..TL; DR: RTFM .. – stevesliva

1

Wie bereits gezeigt mit wird zum Anfang des Programms verschoben. Sie können jedoch die folgende verwenden, auch Linien zu drucken:

sed -n 'n;p' 

und Quoten zu drucken:

sed 'n;d' 

In GNU sed können Sie auch:

sed '0~2!d' # Odd 
sed '1~2!d' # Even 

Eine Alternative etwas sein kann, wie:

N;s/^[^\n]*\n// 

w Das wird die nächste Zeile in den Musterraum lesen und dann die erste Zeile ersetzen.

Man könnte fragen, warum dies das Verhalten ist. Ein Grund dafür ist, um Dinge wie dies möglich zu machen, die Arbeit mit mehrfach Linien in dem Musterraum:

$!N;/\npattern$/d;P;D 

Die obigen Zeilen löschen Musterabgleich sowie die Linie vor.