正则表达式:以特定事物结束

时间:2017-09-17 21:54:12

标签: regex bash terminal

我试图找到一个以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

4 个答案:

答案 0 :(得分:2)

这对于egrep来说非常简单:

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

那是:

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

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

(是的,对于观众中的迂腐伙伴,egrep确实只是grep -Egrep --extended-regexp的替代名称,但它更容易记住并输入{{1}比其他两个“原生”形式中的任何一个。)

答案 1 :(得分:1)

假设:

$ 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:]]+'

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

另一个awk提案。第一部分/ ^ Hello $ /只匹配一个singel Hello,第二部分匹配//,在这种情况下打印整行。

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

Hello
Hello //
Hello // blah blah
Hello //blah
相关问题