【问题标题】:awk multiple matching patternsawk 多个匹配模式
【发布时间】:2013-02-16 07:02:46
【问题描述】:

awk 似乎匹配匹配表达式的所有模式并执行相应的操作。有没有可以关联的优先级?

例如。在下面,以# (cmets) 开头的行被两种模式匹配,并且两个动作都被执行。我希望注释行仅匹配第一个操作。

/^#.*/  {
    // Action for lines starting with '#'
}


{
    // Action for other lines
}

【问题讨论】:

  • 为什么不用else语句?
  • @Zulu:因为在 AWK 中使用块外的操作并使用 next 跳过后续块是惯用的。

标签: awk


【解决方案1】:

如果你想保留你已经拥有的大部分代码,你可以使用 awk next 语句。一旦遇到next 语句,awk 就会跳过处理当前记录并转到下一行。

因此,如果您将next 放入您的第一个块的底部,则不会执行第二个块。

【讨论】:

    【解决方案2】:

    为什么不简单地if,else

    awk '{ if ($0 ~ /^#/) 
               // Action for lines starting with '#'
           else
               // Action for other lines
          }'
    

    【讨论】:

      【解决方案3】:

      如果您的匹配选项是二元的,您的另一个选择是使用模式否定运算符“!”作为“其他所有内容”行:

      /^#.*/ {
        // Action for lines starting with '#'
      }
      
      !/^#.*/ {
        // Action for other lines
      }
      

      当然,您的第二个模式也可以简单地匹配不以哈希开头的所有内容,即 /^[^#].*/

      但大概,你的例子是一个简化。对于复杂的正则表达式,制作精确的反向匹配可能是不可能的。否定运算符只是使其明确且万无一失。

      而且,您可能已经知道,“.*”部分是不必要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        相关资源
        最近更新 更多