使用正则表达式进行 grep 搜索

grep search with regex

如何使用 grep 找到恰好包含 3 "w"、5 "t" 而没有 "v" 的行?

Input:
----------
aabbccddd4444
wccwwtttjjttuu
zzxxxwwwmmmnnnn

Expected output:
----------------
wccwwtttjjttuu

因为在 "wccwwtttjjttuu" 中我们有 3 个 "w"、5 个 "t" 而没有 "v"

谢谢!

$ cat ip.txt 
aabbccddd4444
wccwwtttjjttuu
wvccwwtttjjttuu
zzxxxwwwmmmnnnn
ccwwtttjjttuu


使用 grep,使用扩展正则表达式和 -x 选项仅匹配整行

$ grep -xE '([^w]*w){3}[^w]*' ip.txt | grep -xE '([^t]*t){5}[^t]*' | grep -v 'v'
wccwwtttjjttuu


使用 awk,不确定哪个版本支持 {3} 正则表达式构造。我在 GNU awk 4.1.3

上测试过
$ awk '/^([^w]*w){3}[^w]*$/ && /^([^t]*t){5}[^t]*$/ && !/v/' ip.txt 
wccwwtttjjttuu


perl

$ perl -ne '(@w)=/w/g; (@t)=/t/g; (@v)=/v/g; print if $#w==2 && $#t==4 && $#v==-1' ip.txt 
wccwwtttjjttuu
  • @w, @t, @v 数组分别包含所有 w, t, v 个字符
  • $#w 给出 @w 中最后一个元素的索引,所以它的值是元素数减去一个
perl -ne'/v/||y/w/w/d==3&&y/t/t/d==5&&print'