如何删除前导和尾随空格?

use*_*552 13 awk whitespace gsub removing-whitespace

我正在使用awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt删除前导和尾随空格.

问题是输出文件实际上有尾随空格!所有线条都具有相同的长度 - 它们用空格填充.

我错过了什么?

更新1

问题可能是由于尾随空格不是"正常"空格而是\ x20个字符(DC4).

更新2

我用过gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"")它了.两件奇怪的事:

  1. 为什么不将\ x20视为控制角色?

  2. 使用'[[:cntrl:][:space:]\x20不起作用.为什么?

kev*_*kev 26

这个命令对我有用:

$ awk '{$1=$1}1' file.txt
Run Code Online (Sandbox Code Playgroud)

  • @eddi.`awk`将通过删除多余的空格来规范化一行.`$ 1 = $ 1`触发动作,否则什么都不会发生. (3认同)
  • @eddi“ 1”与“ {print}”相同。它将打印每一行。 (2认同)

oli*_*bre 5

你的代码对我来说没问题。
除了spaceand tabulation...之外,您可能还有其他东西
hexdump -C可以帮助您检查问题所在:

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

更新:

好的,您确定了 DC4(可能还有一些其他控制字符...)
然后,您可以改进您的命令:

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

请参阅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
Run Code Online (Sandbox Code Playgroud)

但是,如果您0x20的文本中间有
=>,那么它不会被删除。
但这不是你的问题,不是吗?