Awk 多重匹配模式
awk似乎匹配与表达式匹配的所有模式,并执行相应的操作。是否存在可以关联的优先级 例如,在下面的示例中,以#(注释)开头的行由两种模式匹配,并且两种操作都被执行。我希望注释的行只匹配第一个操作Awk 多重匹配模式,awk,Awk,awk似乎匹配与表达式匹配的所有模式,并执行相应的操作。是否存在可以关联的优先级 例如,在下面的示例中,以#(注释)开头的行由两种模式匹配,并且两种操作都被执行。我希望注释的行只匹配第一个操作 /^#.*/ { // Action for lines starting with '#' } { // Action for other lines } 如果你想保持你已经拥有的代码基本上完好无损,你可以使用awk语句。一旦遇到next语句,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
}
当然,您的第二个模式也可以简单地匹配所有不以哈希开头的内容,即/^[^#]*/
但想必,您的示例是一个简化。对于复杂的正则表达式,制作精确的逆匹配可能是不可能的。否定运算符只是使它显式且简单明了
而且,您可能已经知道,“*”部分是不必要的。为什么不使用else语句?@Zulu:因为在AWK中习惯于在块外使用动作,然后使用
next
跳过后续块。