awk似乎匹配与表达式匹配的所有模式并执行相应的操作。是否有可以关联的优先级?
例如。在下面,以#(注释)开头的行由两个模式匹配,并且两个动作都被执行。我希望评论的行只匹配第一个动作。
/^#.*/ {
// Action for lines starting with '#'
}
{
// Action for other lines
}
答案 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
}
当然,你的第二个模式也可以简单地匹配所有不以哈希开头的模式,即/^[^#].*/
但据推测,你的例子是简化。对于复杂的正则表达式,制作精确的反向匹配是不可能的。否定运算符只是使它明确且万无一失。
而且,正如您可能已经知道的那样,“。*”部分是不必要的。