我想用我的awk正则表达式来计数和和文件中的匹配数。
文件file包含:
Gra pes
gra ndma
straw berry
blue Berry
banana
peanut
school我需要为模式匹配做一个正则表达式,但是我不知道如何在regex中实现和/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香蕉圈花生错误,但我不知道如何修复它。
对出了什么问题有什么想法吗?谢谢
发布于 2021-08-13 05:27:26
你的雷杰普很好。您的问题是在tolower($1)上匹配它,这是转换为小写的第一个字段(空白,用FS的默认值分隔)。
因此,例如,在第一行(Gra pes)上,它将匹配针对gra的regexp并失败。
为了记录在案,您需要$0:
awk 'tolower($0) ~ /regexp/ ...'还请注意,在默认情况下,regexp没有锚定,因此,它将在peanutbutter上匹配,例如在peanut中找到。如果希望通过regexp将输入记录作为一个整体进行匹配,则需要:
awk 'tolower($0) ~ /^(foo|bar)$/'它在主题(^)的开头与foo或bar后面的主题($)后面匹配。请注意,括号在那里很重要。^foo|bar$要么是^foo (开始时的foo),要么是bar$ (最后是bar),比如在fooX或Ybar上匹配。
https://unix.stackexchange.com/questions/664504
复制相似问题