【问题标题】:Skipping line and regex in awk [duplicate]awk中的跳线和正则表达式[重复]
【发布时间】:2014-10-26 08:42:51
【问题描述】:

我正在使用 awk,我需要跳过空白行或 cmets。我一直在循环内部尝试查看它是否与正则表达式匹配,然后使用下一个

{if ($0 ~"/^($|#)/" ) {next;}}

但是 if 语句永远不会被击中,我不知道为什么。 (我的输入有空行和cmets)

我需要将此行添加到块中的 awkscript 内,而不是命令行参数。

【问题讨论】:

    标签: regex shell awk


    【解决方案1】:

    假设您位于 awk 代码块中,该代码块不会从匹配模式的默认打印中受益,并且您需要使用 if 测试,这是解决方案的基础

    $ echo "a
    b
    c
    
    d
    #
    #e
    
    f
    
    " | awk '{if ($0 ~ /^(#|$)/ ) {next;} ;print}'
    

    产生输出

    a
    b
    c
    d
    f
    

    如果您想跳过包含空格/制表符的空白行,您可以添加

    awk '{if ($0 ~ /^(#|[ \t]*$)/ ) {next;} ;print}'
    #-------------------^^^^^^
    #                   means char-class of space and tab char
    #                   * means zero or more of preceding
    

    IHTH

    【讨论】:

      【解决方案2】:

      awk 中,正则表达式由开头和结尾的斜杠标记。如果你把它放在引号内,它就不再是一个正则表达式,而是一个字符串。因此,替换:

      {if ($0 ~"/^($|#)/" ) {next;}}
      

      与:

      {if ($0 ~ /^($|#)/ ) {next;}}
      

      示例

      考虑输入文件:

      $ cat input
      one
      #comment
      two
      
      three
      
      four
      

      现在观察awk 脚本:

      $ awk '{if ($0 ~ /^($|#)/ ) {next;}} 1' input
      one
      two
      three
      four
      

      【讨论】:

        【解决方案3】:

        您可以使用以下一种:

        awk '! /^($|#)/' infile
        

        它对不以# 开头或为空白的每一行使用默认的打印操作。

        【讨论】:

          【解决方案4】:
          awk '/^$|#/{next} {print $0}' 
          

          会做的工作

          更简单

          awk '/^[^$#]/ '
          

          它有什么作用?

          /^[^$#]/ 将每一行与正则表达式匹配,如果找到匹配项,则会执行打印整条记录的默认操作。

          ^ 将正则表达式锚定在行首。

          [^$#] 否定字符类。确保行首不跟

          $ => 行为空,否定跳过该行 # => 评论

          例如

          $ cat input 
          hello
          #world
          
          this is a
          test
          
          $ awk '/^[^$#]/ ' input 
          hello
          this is a
          test
          

          【讨论】:

          • 我对它如何适合 if 语句感到有点困惑。你能提供更多的例子吗?
          • 这里不需要使用任何 if 语句。将为答案添加解释
          • 查看编辑后的答案。希望它变得更清楚
          • 我需要在脚本中使用它。我不断收到一个错误,即 'awk {if ($0 ~ /^(#|[ \t]*$)/ ) {next;} ;print}' ^ invalid char ''' in expression 或类似的东西。
          • @Sams:这是一个错字,还是你的意思是awk '{if ($0 ~ /^(#|[ \t]*$)/ ) {next;} ;print}'? (注意开头的单引号字符的位置)。祝你好运。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-22
          • 2016-04-22
          • 1970-01-01
          相关资源
          最近更新 更多