Awk
運算符的 awk 正則表達式
我想用我的 awk 正則表達式計算和總結文件中的匹配數。
該文件
file
包含:Gra pes gra ndma straw berry blue Berry banana peanut school
我需要為模式匹配製作一個正則表達式,但我不確定如何在正則表達式中實現AND/OR,儘管它們具有相同的優先級。
我努力了:
awk 'tolower($1) ~ /(gra|straw) (pes|berry)|banana|peanut/ {sum+=1} END {print sum+0}' file
所以它應該是
(gra pes, gra berry, straw pes, straw berry) OR banana, peanut
並且返回 4,因為有 4 個匹配項。我假設我的OR香蕉|花生的語法有問題,但我不知道如何解決它。
關於出了什麼問題的任何想法?謝謝你
你的正則表達式很好。你的問題是你匹配它
tolower($1)
是第一個欄位(空格分隔的預設值FS
)轉換為小寫。因此,例如,在第一行 (
Gra pes
) 中,它將匹配正則表達式gra
並失敗。對於整個記錄,您想要
$0
:awk 'tolower($0) ~ /regexp/ ...'
另請注意,正則表達式預設情況下不會錨定,因此它將匹配
peanutbutter
例如在其中peanut
找到的內容。如果您希望輸入記錄與正則表達式作為一個整體匹配,您需要:awk 'tolower($0) ~ /^(foo|bar)$/'
與主語開頭( )匹配,
^
後跟其中一個foo
或bar
後跟主語($
)。請注意,括號在那裡很重要。^foo|bar$
將是^foo
(foo
在開始時) 或bar$
(bar
在結束時),因此將匹配 onfooX
或Ybar
例如。