在一系列文件中,我想看看哪一行至少有4次是同一单词的相同出现次数。这个词可以是任何词。
所以输入:
亚伯比 oooopppyyy 战争 xxooiippzzyy
输出:
呜pppyyy w ^ RRR uuiioo [R
我目前尝试的是确保将句子分开放置,以准备基本处理。
cat * |
tr '\n' ' '|
sed 's/[.!?;"]/ & /g' |
sed 's/[.!?]/&\n/g'|
grep -E -w '\b([[:alnum:]]*)\{4*\}\b'
但是我的grep却什么都没得到,所以我怎么才能得到Grep只打印出包含一个单词至少出现4次的所有句子?
使用GNU grep
,你可以使用PCRE正则表达式,例如
grep -P '\b(\w+)\b(.*\b\1\b){3}'
请参阅regex演示。
在Ubuntu 18.04.4 LTS中测试:
细节
\b(\w+)\b
-整个单词(捕获在第1组中)(\b
是单词边界,并且\w
匹配字母,数字或下划线)(.*\b\1\b){3}
-{3}
任何\1
单词的三个出现(),其值与第1组中的值相同(作为对第1组值的内联反向引用),作为整个单词(再次\b
使用单词边界)。
您可以通过将单词边界放入组中来简化:
grep -E '(\b\w\b)(.*\1){3}'
。除非有一个极端的情况,我没有想到。@wjandrea捕获组仅保留值,而不保留模式。因此,
\1
没有意识到它所保存的字符串是否被整个单词捕获的事实。我们需要我在模式中使用的所有单词边界。嗯,我知道,如果您使用的输入如
o do to moe
,我的匹配(错误肯定),您的则不会。您的解决方案@WiktorStribiżew也给我带来了误报。我想说,这很可能与第一个单词的边界有关。
en vrouwen gelijk voor de wet en maken we geen
是我的结果之一,但是en一词不会单独弹出4次。如果您计算单词中的en,它会起作用。嗯,这似乎可行。谢谢您解决我的问题。