webentwicklung-frage-antwort-db.com.de

Wie entferne ich führende und nachfolgende Leerzeichen?

Ich verwende awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt, um führende und nachfolgende Leerzeichen zu entfernen.

Das Problem ist, dass die Ausgabedatei tatsächlich nachgestellte Leerzeichen enthält! Alle Zeilen sind gleich lang - sie sind rechts mit Leerzeichen aufgefüllt.

Was vermisse ich?

UPDATE 1

Das Problem ist wahrscheinlich auf die Tatsache zurückzuführen, dass die nachfolgenden Leerzeichen keine "normalen" Leerzeichen, sondern\x20 Zeichen (DC4) sind.

UPDATE 2

Ich habe gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"") benutzt und es hat funktioniert. Zwei merkwürdige Dinge:

  1. Warum wird\x20 nicht als Steuerzeichen angesehen?

  2. Die Verwendung von '[[:cntrl:][:space:]\x20 funktioniert NICHT. Warum?

13
user1194552

Dieser Befehl funktioniert für mich:

$ awk '{$1=$1}1' file.txt
25
kev

Ihr Code ist für mich in Ordnung.
Möglicherweise haben Sie etwas anderes als space und tabulation...
hexdump -C kann Ihnen helfen zu überprüfen, was falsch ist:

awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt | hexdump -C | less

AKTUALISIEREN:

OK, Sie haben DC4 identifiziert (möglicherweise gibt es andere Steuerzeichen ...)
Dann können Sie Ihren Befehl verbessern:

awk '{gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;}' in.txt > out.txt

Siehe awk-Manpage:

[:alnum:] Alphanumeric characters.
[:alpha:] Alphabetic characters.
[:blank:] Space or tab characters.
[:cntrl:] Control characters.
[:digit:] Numeric characters.
[:graph:] Characters that are both printable and visible. (A space is printable, but not visible, while an a is both.)
[:lower:] Lower-case alphabetic characters.
[:print:] Printable characters (characters that are not control characters.)
[:punct:] Punctuation characters (characters that are not letter, digits, control characters, or space characters).
[:space:] Space characters (such as space, tab, and formfeed, to name a few).
[:upper:] Upper-case alphabetic characters.
[:xdigit:] Characters that are hexadecimal digits.

Leading/Trailing 0x20 Entfernung

Für mich ist der Befehl OK, ich habe folgendes getestet:

$ echo -e "\x20 \tTEXT\x20 \t" | hexdump -C
00000000  20 20 09 54 45 58 54 20  20 09 0a                 |  .TEXT  ..|
0000000b
$ echo -e "\x20 \tTEXT\x20 \t" | awk '{gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;}' | hexdump -C
00000000  54 45 58 54 0a                                    |TEXT.|
00000005

Wenn Sie jedoch 0x20 in der Mitte Ihres Textes haben 
=> dann wird es nicht entfernt. 
Aber das ist nicht Ihre Frage, nicht wahr?

4
olibre

Ihre Dateien haben wahrscheinlich Windows-Zeilenenden. Das bedeutet, dass sie mit \r\n enden, sodass das Übereinstimmen einer Folge von Tabulatoren und Leerzeichen am Ende der Zeile nicht funktioniert - awk versucht, alle Tabulatoren und Leerzeichen zu finden, die nach dem \r kommen. Versuchen Sie, die Datei über tr -d "\r" auszuführen, bevor Sie sie an awk senden. 

1

Perl könnte verwendet werden:

Perl -lpe 's/^\s*(.*\S)\s*$/$1/' in.txt > out.txt

s/foo/bar/ ersetzt reguläre Ausdrücke
^ Anfang der Zeichenfolge
\s* null oder mehr Leerzeichen
(.*\S) beliebige Zeichen, die mit einem Nicht-Whitespace enden. Nimm es in $ 1 auf
\s* null oder mehr Leerzeichen
$ end of string

0
Chris Koknat