【问题标题】:Detect repeated characters using grep使用 grep 检测重复字符
【发布时间】:2012-10-24 01:56:51
【问题描述】:

我正在尝试编写一个 grep(或 egrep)命令,该命令将查找并打印“words.txt”中连续三次包含相同小写字母的任何行。三个字母可能连续出现(如“mooo”)或由一个或多个空格分隔(如“x x x”)但不被任何其他字符分隔。

words.txt 包含:

The monster said "grrr"!
He lived in an igloo only in the winter.
He looked like an aardvark.

以下是我认为该命令的外观:

grep -E '\b[^ ]*[[:alpha:]]{3}[^ ]*\b' 'words.txt'

虽然我知道这是错误的,但我对语法的了解还不够,无法弄清楚。使用grep,有人可以帮助我吗?

【问题讨论】:

    标签: linux bash grep


    【解决方案1】:

    这对你有用吗?

    grep '\([[:lower:]]\) *\1 *\1'
    

    它需要一个小写字符[[:lower:]] 并记住它\( ... \)。它会尝试匹配任意数量的空格_*(包括0)、记住的字符\1、任意数量的空格、记住的字符。就是这样。

    您可以尝试使用--color=auto 运行它,以查看它匹配输入的哪些部分。

    【讨论】:

    • 是的,确实有效。我很明显地意识到 [[:lower:]] 的意义,之前和之后的 \ 记住了它。 *\1 表示记住的字符?
    • @BernieMacinflor:我添加了解释。 \1 表示第一个记住的字符,_* 表示任意数量的空格。
    • 我在解释中使用 _ 而不是空格,因为我无法在反引号中添加空格。
    • 你能不能有两个记住的字符,然后用\2来指代第二个记住的字符?
    • @BernieMacinflor:当然。请参阅 man grep 中的反向引用。
    【解决方案2】:

    试试这个。请注意,这不会匹配“mooo”,因为单词边界 (\b) 出现在“m”之前。

    grep -E '\b([[:alpha:]]) *\1 *\1 *\b' words.txt

    [:alpha:] 是字符类的表达式。要用作正则表达式字符集,它需要额外的括号。您可能已经知道这一点,因为您似乎已经开始这样做了,但没有关闭左括号。

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      相关资源
      最近更新 更多