【问题标题】:Regex: Ending with a specific thing正则表达式:以特定事物结尾
【发布时间】:2018-02-26 09:30:40
【问题描述】:

我试图找到一个以 Hello 开头并以以下两种方式之一结束的表达式:在“Hello”之后没有任何内容,或者在它之后需要以“//”开头的其他内容。在 // 之后,任何事情都会发生。

我试过了:grep '^Hello(//.*)?$' 但这不起作用。
最后一部分有问题:(//.*)?$

Sample Input:
Hello
Hello blah
Hi
Hello //
Hello // blah blah
Hello //blah

Sample Output using egrep:
Hello
Hello //
Hello // blah blah
Hello //blah

【问题讨论】:

  • 最好包含样本输入和预期输出。包括一个相似但不应匹配的样本输入。祝你好运。
  • @shellter 已编辑。希望这可以解决问题。
  • 某事如何以一无所有结束?你是说空白吗?
  • @Yunnosch 很抱歉措辞奇怪,基本上是的。
  • “基本上”。请解释一下,阅读How to Askminimal reproducible example。还请解释它是如何“不起作用”的。并给出更多应该匹配和不应该匹配的例子。

标签: regex bash terminal


【解决方案1】:

另一个 awk 建议。第一部分 /^Hello$/ 只匹配一个 Hello,第二部分匹配 // 并且在这种情况下打印整行。

awk '/^Hello$/||/\/\//' file

Hello
Hello //
Hello // blah blah
Hello //blah

【讨论】:

    【解决方案2】:

    使用 egrep (-x) 的“仅匹配整行”选项。
    然后寻找可选​​的空格([[:space:]]*),两个转义的/\/\/),后跟任何或没有,.*
    使用可选说明符和括号来允许特殊结尾,而不是要求它 ((...)?)。

    egrep -x "Hello([[:space:]]*\/\/.*)?"
    

    【讨论】:

      【解决方案3】:

      给定:

      $ echo "$txt" 
      Hello
      Hello blah
      Hi
      Hello //
      Hello // blah blah
      Hello //blah
      

      grep:

      $ echo "$txt" | grep -E '^Hello$|^Hello[[:space:]]+//'
      Hello
      Hello //
      Hello // blah blah
      Hello //blah
      

      或者awk:

      $ echo "$txt" | awk '/^Hello$/ || /Hello[[:space:]]+\/\//'
      Hello
      Hello //
      Hello // blah blah
      Hello //blah
      

      或者如果你想确定//之后有什么东西:

      $ grep -E '^Hello$|^Hello[[:space:]]+//[^[:space:]]+'
      

      【讨论】:

        【解决方案4】:

        这对 egrep 来说非常简单:

        egrep '^Hello(\s*\/\/.*)?$' input.txt
        

        即:

        • ^ ... - 强制匹配从行首开始。
        • Hello - 绝对匹配所需的短语 Hello
        • (\s* ... ) - 允许可选空格跟随Hello
        • ( ... \/\/ ... ) - 匹配正斜杠,转义它们(因为一些 shell 可以对你的正则表达式做一些有趣的事情)。
        • ( ... .*) - 允许斜线后面的任何内容。
        • ( ... )? - 问号表示括号中的部分是可选的。
        • ... $ - 强制正则表达式仅在它消耗到行尾时才匹配。

        您使用的是grep 而不是egrep。普通的grep 使用更简单的正则表达式语法,它不允许某些您可能喜欢使用的运算符。值得注意的是,在普通的grep 中,括号和? 只是普通字符,而不是用于分组的特殊元字符,所以普通的grep 在你的文件中搜索literal () .如有疑问,请首选egrep

        (是的,对于听众中那些迂腐的人来说,egrep 确实只是grep -Egrep --extended-regexp 的替代名称,但它比其他两个更容易记住和输入egrep “本地”形式。)

        【讨论】:

        • 注意:这将匹配Hello //,在// 之后没有任何内容,因为最后的.* 表示0 或更多。
        • 她的示例输出(现在)包括 Hello // 作为预期结果的一部分,所以我认为这就是她想要的行为。
        猜你喜欢
        • 2013-08-26
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        相关资源
        最近更新 更多