代码之家  ›  专栏  ›  技术社区  ›  matcheek

空白字段中的反斜杠

  •  0
  • matcheek  · 技术社区  · 14 年前

    我刚刚被要求用gawk检查我所有的输出文件,我尽量避免使用gawk。

    gawk 'NF \!= 6' file
    

    不同于

    gawk 'NF != 6' file 
    

    也就是说,反斜杠如何改变这个表达式的含义?

    它是否应该输出字段数不同于6且以反斜杠结尾的行?

    我的文件出现以下错误:

    gawk:    ^ backslash not last character on line
    

    有人吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   John Kugelman Michael Hodel    14 年前

    如果使用双引号而不是单引号,则 ! 是一个特殊字符,应该用反斜杠转义。重要的是,你要避开感叹号 看不到。

    gawk "NF \!= 6" file
    

    在双引号中,shell将转换 \! !

    ! 字符,所以不需要用反斜杠来转义。事实上,正如您发现的那样,这样做是一个语法错误,因为反斜杠最终被传递给gawk,gawk在意外情况下会出现barfs \ .

        2
  •  1
  •   Diego Sevilla    14 年前

    $ gawk 'NF \
    != 6' file
    

    也会有同样的效果。

    你的例子特别有点棘手。把字符串放在单引号内。这使得shell不会修改您编写的内容,并将其传递给程序。如果使用反斜杠表达式,gawk将找到 \

        3
  •  1
  •   Dennis Williamson    14 年前

    如果要匹配没有6个字段且以反斜杠结尾的行,可以使用以下方法:

    gawk -v 'patt=\\\\$' 'NF != 6 && $0 ~ patt' file
    

        4
  •  1
  •   jhdiii    14 年前

    无论您使用双引号还是单引号,如果您使用的是类似于Bourne的shell,gawk将看到程序与引号之间的显示完全一样。即使在双引号中,Bourne和csh-like shell也只使用可能需要转义的字符(如$,在csh的情况下,!)!-因此,在csh中,这个程序在语法上看起来对gawk来说是正确的,尽管它仍然不会做您想要的事情)。

    ! 在这种情况下没有呆呆的意思,所以它给出了一个错误。要“字段数不同于6且以反斜杠结尾的输出行”,请使用:

    gawk 'NF != 6 && /\\$/' file

    全部的 \(被另一个字符转义的除外)被吸收;不转义特殊字符的则被省略。

    如果没有关联的操作,则在满足此条件语句时将执行默认操作(打印行)。