web-dev-qa-db-ja.com

先頭と末尾の空白を削除するにはどうすればよいですか?

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

問題は、出力ファイルに実際に末尾の空白があることです!すべての行は同じ長さです-それらはスペースで右パディングされます。

何が欠けていますか?

更新1

問題は、末尾のスペースが「通常の」スペースではなく、\ x20文字(DC4)であることが原因であると考えられます。

更新2

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

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

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

14
user1194552

このコマンドは私にとってはうまくいきます:

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

あなたのコードは私には大丈夫です。
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_がある場合
=>削除されません。
しかし、これはあなたの質問ではありませんね。

4
olibre

ファイルにはおそらくWindowsの行末があります。つまり、それらは\r\nで終わるので、行の終わりにあるタブとスペースのシーケンスを照合しても機能しません-awkは、来るすべてのタブとスペースを照合しようとしますafter = \r。 awkに送信する前に、tr -d "\r"でファイルを実行してみてください。

1

Perlを使用できます:

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

s/foo/bar/正規表現を使用して置換
^文字列の始まり
\s* 0個以上のスペース
(.*\S)非空白文字で終わる文字。それを$ 1に取り込む
\s* 0個以上のスペース
$文字列の終わり

0
Chris Koknat