2017-07-24 3 views
3

Mein sed-Skript ist dies:sed: Verhalten von H und D

# script.sed 
1,3H 
1,3g 
3D 

Wenn ich es laufen, erhalte ich folgendes:

$ seq 5 | sed -f script.sed 

1 

1 
2 
4 
5 

Doch dies scheint mir falsch. In Zeile 3, sobald der D-Befehl ausgeführt wird, weist der Musterraum

1 
2 
3 

Wenn der Zyklus erneut gestartet wird, H den Halteraum setzen sollte:

<empty_line> 
1 
2 
3 
1 
2 
3 

Dann g sollte eingestellt das Muster Leerzeichen zum selben Inhalt. D wird dann die erste (leere) Zeile entfernen. Jedes Mal, wenn der Zyklus neu gestartet wird, verdoppelt sich der Laderaum effektiv. Daher sollte dies zu einer Endlosschleife führen.

Was fehlt mir?

+0

in Zeile 3 der 'D' Befehl löscht wiederholt bis und jede Zeile in dem Musterraum einschließlich, bis keine Zeilen übrig sind. Der Befehl bleibt im Wesentlichen in Zeile 3, bis alles gelöscht ist. – potong

+0

@potong nicht wahr. Wenn ich ein '=' davor einfüge, sehe ich, dass die Zeilennummer (3) mehrmals gedruckt wird. Also, es beginnt den ganzen Weg von oben. – euphoria83

+0

Zeile 3 wird jedoch nie gedruckt, da der normale Druckteil der sed-Schleife nie erreicht wird, wenn der Befehl 'D' ausgeführt wird. Versuchen Sie, einen '3p'-Befehl oder einen' 3P' einzufügen. – potong

Antwort

1

Im Folgenden zeige ich, wie ich die erwartete Ausführung interpretieren, als geordnetes Paar das Ergebnis des Befehls zeigte, mit dem Musterraum ersten und dem Halteraum folgenden:

1: H(1,\n1) g(\n1,\n1)        > \n1\n 
2: H(2,\n1\n2) g(\n1\n2,\n1\n2)      > \n1\n2\n 
3: H(3,\n1\n2\n3) g(\n1\n2\n3,\n1\n2\n3) D(,\n1\n2\n3) > 
4:              > 4\n 
5:              > 5\n 

Wenn ich die Ausgabe nehmen diese Interpretation und in einen Echo-Befehl mit der Option -e verketten, erhalte ich:

$ echo -e '\n1\n\n1\n2\n4\n5\n' 

1 

1 
2 
4 
5 
Verwandte Themen