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:
Warum wird\x20 nicht als Steuerzeichen angesehen?
Die Verwendung von '[[:cntrl:][:space:]\x20
funktioniert NICHT. Warum?
Dieser Befehl funktioniert für mich:
$ awk '{$1=$1}1' file.txt
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
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.
0x20
EntfernungFü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?
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.
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