awk似乎匹配匹配表達式的所有模式並執行相應的操作。是否有優先級可以關聯?awk多個匹配模式
對於如。在下面,以#(註釋)開始的行被兩種模式匹配,並且兩個動作都被執行。我想要註釋行只匹配第一個動作。
/^#.*/ {
// Action for lines starting with '#'
}
{
// Action for other lines
}
awk似乎匹配匹配表達式的所有模式並執行相應的操作。是否有優先級可以關聯?awk多個匹配模式
對於如。在下面,以#(註釋)開始的行被兩種模式匹配,並且兩個動作都被執行。我想要註釋行只匹配第一個動作。
/^#.*/ {
// Action for lines starting with '#'
}
{
// Action for other lines
}
如果你想保持你已經擁有幾乎完好無損的代碼,你可以只使用awk
next聲明。一旦遇到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
}
當然,你的第二個模式也可以簡單地匹配一切不以哈希開始,即/^[^#].*/
但presumabl Ÿ,你的例子是一個簡化。對於複雜的正則表達式,製作精確的反向匹配可能是不可能的。否定運算符只是使其明確和萬無一失。
而且,正如您可能已經知道的那樣,「。*」部分是不必要的。
爲什麼不使用else語句? – Zulu
@Zulu:因爲在AWK中使用區塊外的動作並使用'next'來跳過後續區塊是習慣用法。 –