【问题标题】:Searching for multiple matches on one line using Grep and Regex使用 Grep 和 Regex 在一行上搜索多个匹配项
【发布时间】:2017-11-25 05:47:39
【问题描述】:

我正在尝试使用 Grepwc -l 来打印文本文件中连续有 3 个或更多元音的单词数。

现在,我正在输入:

grep -i -E '<\.*[aeiou]{3}.*\>' file.txt | wc -l

但这并没有返回正确数量的单词,因为在某些行中有多个连续有 3 个元音的单词。

如果 file.txt 包含这个:

beautiful courteous 
beautiful 
courteous

我想要的输出是 4,而不是 3,目前我只能得到 3。

我一直在网上寻找解决方案,但我似乎无法弄清楚。有人可以帮忙吗?

【问题讨论】:

    标签: regex command-line grep


    【解决方案1】:

    要将每个匹配的单词放在单独的行上,请使用-o 选项:

    $ grep -iEo '[[:alnum:]]*[aeiou]{3}[[:alnum:]]*' file.txt
    beautiful
    courteous
    beautiful
    courteous
    $ grep -iEo '[[:alnum:]]*[aeiou]{3}[[:alnum:]]*' file.txt | wc -l
    4
    

    [[:alnum:]]*[aeiou]{3}[[:alnum:]]* 匹配具有三个连续元音的单词。 -o 确保每个单词都在单独的行上。

    如果你想更严格地定义一个词,你可能想改用[[:alpha:]]*[aeiou]{3}[[:alpha:]]*

    文档

    来自man grep

    -o, --only-matching
    只打印匹配的(非空) 匹配行的一部分,每个这样的部分都在一个单独的输出上 行。

    讨论

    考虑:

    \<.*[aeiou]{3}.*\>'
    

    在上面,请注意. 匹配任何 字符,而.* 是贪婪的:它匹配最长可能匹配。因此,\&lt;.*[aeiou]{3} 将从一行的第一个单词的开头匹配到一行中三个元音的最后一次出现。最终的.*\&gt; 将从那里匹配到该行最后一个单词的结尾。这不是你需要的。

    【讨论】:

      【解决方案2】:

      您应该分两步完成...

      首先将文件拆分为单词:

      tr -s '[[:punct:][:space:]]' '\n' < file.txt > wordsFile.txt
      

      然后你计算匹配的单词:

      grep -i -E '.*[aeiou]{3}.*' wordsFile.txt | wc -l
      

      【讨论】:

        猜你喜欢
        • 2015-02-11
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-03
        • 1970-01-01
        • 2017-02-25
        相关资源
        最近更新 更多