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/,"")它了.两件奇怪的事:
为什么不将\ x20视为控制角色?
使用'[[:cntrl:][:space:]\x20不起作用.为什么?
kev*_*kev 26
这个命令对我有用:
$ awk '{$1=$1}1' file.txt
Run Code Online (Sandbox Code Playgroud)
你的代码对我来说没问题。
除了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的文本中间有
=>,那么它不会被删除。
但这不是你的问题,不是吗?