【问题标题】:strings that have exactly 20 vowels in any position任何位置正好有 20 个元音的字符串
【发布时间】:2022-09-23 01:59:41
【问题描述】:

元音不必连续出现。

  • 我想你的意思是grep -P \'([aeiouy][^aeiouy]*){3}\'

标签: awk grep


【解决方案1】:

这项工作可以使用awk 轻松完成,而无需使用任何正则表达式。只需将字段分隔符设置为其中一个元音,然后确保我们有 4 个字段:

awk -F '[aeiouy]' 'NF == 4' file

PS:y 不是真正的元音,但由于您显示的示例而被包括在内。

【讨论】:

    【解决方案2】:

    使用[^aeiouy] 匹配非元音。在每个元音模式周围放置一系列这些。

    grep -x '[^aeiouy]*[aeiouy][^aeiouy]*[aeiouy][^aeiouy]*[aeiouy][^aeiouy]*' filename
    

    使用-x 选项匹配整行,或使用^$ 锚定正则表达式。

    您不需要 PCRE,这只使用传统的正则表达式模式。

    【讨论】:

    • 还是只是grep -xE '[^aeiouy]*([aeiouy][^aeiouy]*){3}' filename
    【解决方案3】:

    使用任何 awk:

    $ echo 'bonfire' | awk 'gsub(/[aeiouy]/,"&")==3'
    bonfire
    $ echo 'beak' | awk 'gsub(/[aeiouy]/,"&")==3'
    $ echo 'yearbook' | awk 'gsub(/[aeiouy]/,"&")==3'
    $
    

    【讨论】:

      【解决方案4】:

      对于 Perl 兼容的正则表达式,您不需要 -P

      如果您想使用 grep 匹配 exactly 3 vowels,您可以使用锚点并匹配被否定字符类 [^aeiouy]* 的可选重复包围的 3 个元音,匹配除元音以外的任何字符。

      grep '^[^aeiouy]*\([aeiouy][^aeiouy]*\)\{3\}$' file
      

      -E

      grep -E '^[^aeiouy]*([aeiouy][^aeiouy]*){3}$' file
      

      如果你想要至少 3 个元音:

      grep -E '([aeiouy][^aeiouy]*){2}[aeiouy]' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 2017-07-09
        • 2022-12-09
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多