awk 似乎匹配匹配表达式的所有模式并执行相应的操作。是否有可以关联的优先级?
例如。在下面,以#(注释)开头的行被两种模式匹配,并且两个动作都被执行。我希望注释行仅匹配第一个操作。
/^#.*/ {
// Action for lines starting with '#'
}
{
// Action for other lines
}
awk 似乎匹配匹配表达式的所有模式并执行相应的操作。是否有可以关联的优先级?
例如。在下面,以#(注释)开头的行被两种模式匹配,并且两个动作都被执行。我希望注释行仅匹配第一个操作。
/^#.*/ {
// Action for lines starting with '#'
}
{
// Action for other lines
}
如果你想保留你已经拥有的大部分代码,你可以使用awk
下一条语句。一旦遇到该next
语句,awk
就跳过处理当前记录并转到下一行。
因此,如果您将next
第一个块放入底部,则不会执行第二个块。
为什么不简单地if,else
:
awk '{ if ($0 ~ /^#/)
// Action for lines starting with '#'
else
// Action for other lines
}'
如果您的匹配选项是二进制的,您的另一个选择是使用模式否定运算符'!',用于“其他所有”行:
/^#.*/ {
// Action for lines starting with '#'
}
!/^#.*/ {
// Action for other lines
}
当然,您的第二个模式也可以简单地匹配不以哈希开头的所有内容,即 /^[^#].*/
但大概,你的例子是一个简化。对于复杂的正则表达式,制作精确的反向匹配可能是不可能的。否定运算符只是使其明确且万无一失。
而且,您可能已经知道,“.*”部分是不必要的。