awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt
を使用して、先頭と末尾の両方の空白を削除しています。
問題は、出力ファイルに実際に末尾の空白があることです!すべての行は同じ長さです-それらはスペースで右パディングされます。
何が欠けていますか?
更新1
問題は、末尾のスペースが「通常の」スペースではなく、\ x20文字(DC4)であることが原因であると考えられます。
更新2
私はgsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"")
を使用しました。 2つの奇妙なこと:
\ x20が制御文字と見なされないのはなぜですか?
'[[:cntrl:][:space:]\x20
を使用しても機能しません。どうして?
このコマンドは私にとってはうまくいきます:
$ awk '{$1=$1}1' file.txt
あなたのコードは私には大丈夫です。space
およびtabulation
...以外のものがある可能性があります.
_hexdump -C
_は、何が問題かを確認するのに役立ちます。
_awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt | hexdump -C | less
_
DC4を特定しました(他の制御文字が存在する可能性があります...)
次に、コマンドを改善できます:
_awk '{gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;}' in.txt > out.txt
_
awk
のマンページを参照してください:
_[: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
_削除私にとってはコマンドはOKです、私はこのようにテストしました:
_$ 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
_
ただし、テキストの途中に_0x20
_がある場合
=>削除されません。
しかし、これはあなたの質問ではありませんね。
ファイルにはおそらくWindowsの行末があります。つまり、それらは\r\n
で終わるので、行の終わりにあるタブとスペースのシーケンスを照合しても機能しません-awkは、来るすべてのタブとスペースを照合しようとしますafter = \r
。 awkに送信する前に、tr -d "\r"
でファイルを実行してみてください。
Perlを使用できます:
Perl -lpe 's/^\s*(.*\S)\s*$/$1/' in.txt > out.txt
s/foo/bar/
正規表現を使用して置換^
文字列の始まり\s*
0個以上のスペース(.*\S)
非空白文字で終わる文字。それを$ 1に取り込む\s*
0個以上のスペース$
文字列の終わり