2012-09-03 145 views
4

awk似乎匹配匹配表達式的所有模式並執行相應的操作。是否有優先級可以關聯?awk多個匹配模式

對於如。在下面,以#(註釋)開始的行被兩種模式匹配,並且兩個動作都被執行。我想要註釋行只匹配第一個動作。

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


{ 
    // Action for other lines 
} 
+0

爲什麼不使用else語句? – Zulu

+0

@Zulu:因爲在AWK中使用區塊外的動作並使用'next'來跳過後續區塊是習慣用法。 –

回答

7

如果你想保持你已經擁有幾乎完好無損的代碼,你可以只使用awknext聲明。一旦遇到next聲明,awk將跳過處理當前記錄並轉到下一行。

所以如果你把next置於第一塊的底部,第二塊不會被執行。

4

爲什麼不乾脆if,else

awk '{ if ($0 ~ /^#/) 
      // Action for lines starting with '#' 
     else 
      // Action for other lines 
     }' 
2

你的另一個選擇是使用該模式否定經營者,爲「一切」行,如果你的匹配選項是二進制「!」:

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

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

當然,你的第二個模式也可以簡單地匹配一切不以哈希開始,即/^[^#].*/

但presumabl Ÿ,你的例子是一個簡化。對於複雜的正則表達式,製作精確的反向匹配可能是不可能的。否定運算符只是使其明確和萬無一失。

而且,正如您可能已經知道的那樣,「。*」部分是不必要的。