【问题标题】:Search file for no more than two occurrences of string搜索文件不超过两次出现的字符串
【发布时间】:2018-10-02 05:58:59
【问题描述】:

对于大学课程,我们有一个文件,其中包含以下行

Word Word Word
Word Word
Text Word
Word Worden Word Word someothertext

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

我的猜测是这样的

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

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

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

【问题讨论】:

  • 这是你的任务。如果我们为你做这件事,你什么也学不到。如果您遇到困难,请查看您的课程笔记。如果这没有帮助,请向您的讲师寻求帮助 - 他们需要知道他们未能提供足够内容的地方。
  • 谢谢,但是这个评论不是否定了这个平台的全部目的吗?这个问题不是脚本的一部分,也没有在我们的课程中解决,而且导师也不合作。这些事情都会发生。请让人们生活和学生学习,这里很多人解释的东西比我的教授要好得多。
  • 再次,这是你的任务。您的 猜测 似乎是错误的,所以请尝试其他方法。我们不在这里做作业。如果您的老师不合作,请向您的学校抱怨他们没有做您的学费支付给他们的工作。这不是家庭作业完成或代码编写服务。
  • 其他人正在寻求帮助解决他们的有偿工作问题,所以我真的看不出这里有问题。
  • 他们花钱请人教正则表达式?

标签: regex bash macos unix


【解决方案1】:

类似这样的工作。 ^(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

【讨论】:

    【解决方案2】:

    不是专家,但尝试了一些东西并且成功了,可能有点矫枉过正:

    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
    

    【讨论】:

      【解决方案3】:

      先丢掉三个单词的行,剩下的任务就简单了。

      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"
      

      【讨论】:

        猜你喜欢
        • 2013-05-06
        • 2021-06-20
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 2013-05-27
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多