sed Entfernung von Leerzeichen

sed Entfernung von Leerzeichen

Ich finde, dass seddas 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 seddie 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 sedunterstützen dies nicht \tund einige andere Escape-Befehle auf der linken Seite eines Ersetzungsbefehls.

Informationen zu den Abweichungen zwischen den Versionen finden Sie sedimFAQ.

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

verwandte Informationen