
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