搜索文件不超过两次出现的字符串

时间:2018-04-21 20:21:33

标签: regex bash macos unix

对于大学课程,我们有一个类似

的文件
Word Word Word
Word Word
Text Word
Word Worden Word Word someothertext

我们的任务是使用一个基本的MacOS终端来查找文件中行的开头存在字符串“Word”并且不超过两次的那些行,然后(最好是在同一步骤中)计算那些线。

我的猜测是

grep "^Word" filename.txt | grep -c "(Word){1,2}"

但它让我无处可去,因为第二个grep的模式不会过滤任何东西。

我正在慢慢忘记这个问题,所以我希望这里的任何人都可以提供帮助,谢谢!

3 个答案:

答案 0 :(得分:0)

这样的事情有效。 ^(Word)(?:(?!\1).)*\1?(?:(?!\1).)*$

https://regex101.com/r/xdoxoi/1

至于计算线,那不是正则表达式。

阅读版本

 ^                       # BOS
 ( Word )                # (1)
 (?:                     # Cluster, optional
      (?! \1 )                # Any char doesn't start a 'Word'
      . 
 )*
 \1?                     # Optional 'Word'
 (?:                     # Cluster, optional
      (?! \1 )                # Any char doesn't start a 'Word'
      . 
 )*                      # Any non-'Word'
 $                       # EOS

答案 1 :(得分:0)

不是专家,但尝试了一些有效的方法,可能是一种过度杀伤力:

grep '^bhavya' sample.txt | while read -r line; do 
   x="$( echo $line | grep -o 'bhavya' | wc -l )"
   z="$(echo $x)"
   if [[ "$z" == "2" ]]; then
      echo $line
   fi
done

答案 2 :(得分:0)

首先丢弃带有三个单词的行,剩下的任务很简单。

sed -nr '/(Word).*(\1).*(\1)/d; /^(Word)/p' filename.txt | wc -l

grep -Ev '(Word).*(\1).*(\1)' filename.txt | grep -c "^Word"

of(当你不喜欢反向引用时)

grep -Ev  'Word.*Word.*Word' filename.txt| grep -c "^Word"