awk多个匹配模式

时间:2012-09-03 18:28:58

标签: awk

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

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

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


{
    // Action for other lines
}

3 个答案:

答案 0 :(得分:7)

如果您想保留已经完好无损的代码,可以使用awk next语句。一旦遇到next语句,awk将跳过处理当前记录并转到下一行。

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

答案 1 :(得分:4)

为什么不简单地if,else

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

答案 2 :(得分:2)

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

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

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

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

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

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