14

awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt先頭と末尾の空白の両方を削除するために使用しています。

問題は、実際には出力ファイルの末尾に空白があることです! すべての行は同じ長さで、右側にスペースが埋め込まれています。

私は何が欠けていますか?

更新 1

問題はおそらく、末尾のスペースが「通常の」スペースではなく、\x20 文字 (DC4) であるという事実によるものです。

更新 2

gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"")はそれが働いたを使用しました。2つの奇妙なこと:

  1. \x20 が制御文字と見なされないのはなぜですか?

  2. 使用'[[:cntrl:][:space:]\x20しても機能しません。なんで?

4

4 に答える 4

26

このコマンドは私のために働きます:

$ awk '{$1=$1}1' file.txt
于 2012-02-07T14:17:32.700 に答える
4

あなたのコードは私にとっては問題ありません。and ...
以外の何かがあるかもしれません:spacetabulation
hexdump -C

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

アップデート:

OK、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削除

私にとって、コマンドは問題ありません。次のようにテストしました。

$ 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、テキストの途中にある場合
=> は削除されません。
しかし、これはあなたの質問ではありませんよね?

于 2012-02-07T12:09:54.567 に答える
1

ファイルにはおそらく Windows の行末があります。つまりそれら\r\nは. awk に送信する前に、ファイルを実行してみてください。\rtr -d "\r"

于 2012-02-07T12:14:50.187 に答える
0

Perl を使用できます。

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

s/foo/bar/正規表現を使用して
^、文字列の
\s*ゼロ個以上の先頭を
(.*\S)空白以外の文字で終わる文字に置き換えます。文字列の$1
\s*ゼロ以上のスペースにキャプチャします
$

于 2015-10-06T23:57:03.690 に答える