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/,“”)
一个有效的方法。 两件奇怪的事:

  • 为什么不将\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 the
    1
    {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.
    。我错过了什么吗?顺便问一下,你的设置是什么?