Ich finde, dass sed
das Mustervergleichen von Leerzeichen oft fehlschlägt. Betrachten Sie die folgenden Beispiele:
echo 'A B C' | sed 's/[ \t]*//g'
ABC
echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
A B C
perl -e 'print "A B C\n"' | sed 's/[ \t]*//g'
ABC
perl -e 'print "A\tB\tC\n"' | sed 's/[ \t]*//g'
A B C
Kann mir bitte jemand erklären, warum sed
die Zuordnung von Leerzeichen manchmal fehlschlägt?
Antwort1
1.
echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
A B C
Funktioniert bei mir
$ echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
ABC
Versuche dies
$ echo -e 'a\tb' | sed -e 's/[ \t]//'
ab
2.
perl -e 'print "A B C\n"' | sed 's/^[ \t]*//g'
A B C
Ihr String enthält am Zeilenanfang ( ^
) kein Leerzeichen
Antwort2
Einige Versionen sed
unterstützen dies nicht \t
und einige andere Escape-Befehle auf der linken Seite eines Ersetzungsbefehls.
Informationen zu den Abweichungen zwischen den Versionen finden Sie sed
imFAQ.
Antwort3
Die zweite Anweisung von oben funktioniert auf meinem Rechner (Ubuntu 10.10 amd64, Sed Version 4.2.1, Sed-Paket Version 4.2.1-7) und ich habe keine wirkliche Erklärung, warum diese nicht funktionieren sollte.
Der dritte und vierte Grund liegt darin, dass Sie den Zeilenanfangsanker (^) verwenden.nurEntfernen Sie die führenden Leerzeichen, sodass in Ihrem Eingabetext am Zeilenanfang keine Leerzeichen mehr vorhanden sind.
Antwort4
Du solltest benutzen\Sum sowohl Leerzeichen als auch Tabulatoren abzugleichen:
echo 'A B C' | sed 's/\s//g'
ABC
echo -e 'A\tB\tC' | sed 's/\s//g'
ABC
perl -e 'print "A B C\n"' | sed 's/\s//g'
ABC
perl -e 'print "A\tB\tC\n"' | sed 's/\s//g'
ABC