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

Regex 在文件中搜索不超过两次出现的字符串,regex,bash,macos,unix,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的模式没有过滤任何东西

对于大学课程,我们有一个文件,其行如下

Word Word Word
Word Word
Text Word
Word Worden Word Word someothertext
我们的任务是使用基本的MacOS终端只查找文件中字符串“Word”位于行首且不超过两次的行,然后(最好在同一步骤中)对这些行进行计数

我的猜测大致是这样的

grep "^Word" filename.txt | grep -c "(Word){1,2}"
但这对我毫无帮助,因为第二个grep的模式没有过滤任何东西


我慢慢地对这个问题失去了理智,所以我希望这里的任何人都能帮助我,谢谢

像这样的方法很管用<代码>^(单词)(?:(?!\1)。*\1?(?:(?!\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

不是专家,但尝试了一些东西,效果很好,可能有点过头了:

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

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

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

(当您不喜欢反向引用时)


这是你的任务。如果我们为你做,你什么也学不到。如果你有困难,复习你的课程笔记。如果这没有帮助,请向您的讲师寻求帮助-他们需要知道他们在哪里没有提供足够的内容。谢谢,但这条评论是否否定了这个平台的全部用途?这个问题不是脚本的一部分,也从未在我们的课上解决过,而且讲师也不合作。这些事情经常发生。请让人们生活,让学生学习,这里的很多人比我的教授解释得更好。再说一遍,这是你的作业。你的猜测似乎错了,所以试试别的吧。我们这里不做作业。如果你的导师不合作,向你的学校抱怨他们没有完成你的学费支付给他们的工作。这不是一个家庭作业完成或代码编写服务。其他人要求帮助解决他们的有偿工作问题,所以我真的不认为这里有问题。他们付钱让人教正则表达式?
grep -Ev '(Word).*(\1).*(\1)' filename.txt | grep -c "^Word"
grep -Ev  'Word.*Word.*Word' filename.txt| grep -c "^Word"