Awk 如何删除前导空格和尾随空格?
我正在使用Awk 如何删除前导空格和尾随空格?,awk,whitespace,gsub,removing-whitespace,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:][
awk'{gsub(/^[\t]+|[\t]+$/,“”);print;}'in.txt>out.txt
删除前导和尾随空格
问题是输出文件实际上有尾随空格!所有线条的长度都相同——它们都用空格填充
我错过了什么
更新1
问题可能是因为尾随空格不是“普通”空格,而是\x20个字符(DC4)
更新2
我使用了gsub(/'[:cntrl:]|[:space:]|\x20/,“”)
一个有效的方法。
两件奇怪的事:
”[[:cntrl:][:space:][\x20
不起作用。为什么您的代码对我来说没问题。
除了
空格
和制表
…hextump-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:]字母数字字符。
[:alpha:]字母字符。
[:blank:]空格或制表符。
[:cntrl:]控制字符。
[:数字:]数字字符。
[:graph:]可打印且可见的字符。(空格可打印,但不可见,而A可打印且可见)。
[:小写:]小写字母字符。
[:print:]可打印字符(非控制字符的字符)。
标点符号(不是字母、数字、控制字符或空格字符的字符)。
[:space:]空格字符(例如空格、制表符和表单提要等)。
[:大写:]大写字母字符。
[:xdigit:]是十六进制数字的字符。
前导/尾随
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
=>则不会将其删除。
但这不是你的问题,不是吗?你的文件可能有Windows行结尾。这意味着它们以
\r\n
结尾,因此在行结尾匹配一系列制表符和空格将不起作用——awk尝试匹配\r
之后的所有制表符和空格。请尝试通过tr-d“\r”运行该文件
发送到awk之前。此命令对我有效:
$ awk '{$1=$1}1' file.txt
Perl可用于:
perl -lpe 's/^\s*(.*\S)\s*$/$1/' in.txt > out.txt
s/foo/bar/
使用正则表达式替换^
字符串的开头\s*
零个或多个空格(.*\S)
以非空白结尾的任何字符。将其捕获到$1中\s*
零个或多个空格$
字符串结尾更新:也许这些不是简单的空格,而是DC4控制字符?文件源于Windows。\x20
是一个常规的ASCII空格。控制字符是\x00
到\x1F
。我真的认为这会起作用,但事实并非如此,我仍然保留着所有这些“空格”ASCII码20(int=32).Hello@user1194552。请在awk
处理前后提供您的hextump-C
输出。这样我就能更好地理解您的问题。因为当我尝试测试时,它看起来对我很好:-)您的awk--version
是什么?我可以测试两个版本:GNU awk 3.1.3
和GNU awk 3.1.5
。请提供你的hextump-C
。然后我可以测试和你一样的东西。+1是的,为什么不?;-)你甚至可以做:awk'$1=$1'文件。txt
不是吗?@eddi。awk
将通过删除额外的空格来规范化一行。$1=$1
触发该操作,否则什么都不会发生。我认为你应该将其添加到答案中关于1的作用的解释。@eddi the1
与{print}
相同。它将打印每一行。@kev:它不适用于CentOS 6.5上的GNU Awk 3.1.7和ksh:echo“foo;bar”>tt&&print“$(Awk-F”“-OFS”;“{$2=$2}1'tt)”
给出了\u foo;bar.
。我错过了什么吗?顺便问一下,你的设置是什么?