4

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

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

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


{
    // Action for other lines
}
4

3 回答 3

7

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

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

于 2012-09-03T18:30:32.410 回答
3

为什么不简单地if,else

awk '{ if ($0 ~ /^#/) 
           // Action for lines starting with '#'
       else
           // Action for other lines
      }'
于 2012-09-03T19:04:28.820 回答
2

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

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

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

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

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

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

于 2013-02-14T00:07:37.353 回答