Warum entfernt sed meine leeren Zeilen nicht?

Warum entfernt sed meine leeren Zeilen nicht?

Warum entfernt dieser Sed-Befehl keine leeren Zeilen?

sed -e 's/\r//g' -e '/^{$/d' -e '/^}$/d' -e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D' -e "s/'/''/g" -e '/^$/d' <<< $myvar

Dieser Befehl funktioniert einwandfrei, bis auf den letzten Teil -e '/^$/d' zum Entfernen der leeren Zeilen, der anscheinend überhaupt nichts bewirkt. Hier ist ein Beispiel meines Inhalts:

begin dump

Ctrl_ID:100

Dies ist derselbe Inhalt, der mit cat -A angezeigt wird.

begin dump$
$
Ctrl_ID:100$

Wenn man die leere Zeile mit einem Hex-Editor untersucht, sieht man, dass sie nur ein einziges Zeichen mit dem Hex-Wert enthält

0A

Das ist genau der gleiche Code am Ende jeder Zeile.

Ich verstehe nicht, was hier los ist.

^$müsste doch passen, oder?

Antwort1

Versuchen Sie Folgendes (das Entfernen leerer Zeilen steht jetzt an der ersten Position):

sed -e '/^$/d' -e 's/\r//g' -e '/^{$/d' -e '/^}$/d' -e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D' -e "s/'/''/g" <<< $myvar

Der Teil, der dafür verantwortlich ist, dass das Entfernen leerer Zeilen nicht funktioniert, ist dieser:

-e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D'

tiefer gehen...

D löscht den Inhalt des Musterbereichs bis zur ersten neuen Zeile (oder bis zum Ende, wenn keine neue Zeile vorhanden ist) und startet einen neuen Zyklus. Letzteres bedeutet, dass alle Befehle, die im sed-Programm nach dem D kommen, nicht ausgeführt werden, wenn D selbst ausgeführt wird.

ausHier

verwandte Informationen