我试图找到一个以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
答案 0 :(得分:2)
这对于egrep来说非常简单:
egrep '^Hello(\s*\/\/.*)?$' input.txt
那是:
^ ...
- 强制匹配从行首开始。Hello
- 绝对匹配所需的短语Hello
。(\s* ... )
- 允许可选空格跟随Hello
。( ... \/\/ ... )
- 匹配正斜杠,逃避它们(因为有些贝壳可以对你的正则表达式做有趣的事情)。( ... .*)
- 在斜杠后允许任何内容。( ... )?
- 问号表示带括号的部分是可选的。... $
- 强制正则表达式仅匹配,如果它消耗在行尾。您使用的是grep
而不是egrep
。普通grep
使用更简单的正则表达式语法,它不允许您可能想要使用的某些运算符。值得注意的是,在普通grep
中,括号和?
只是普通字符,而不是用于分组的特殊元字符,因此普通grep正在搜索 literal (
和您文件中的)
。如有疑问,请选择egrep
。
(是的,对于观众中的迂腐伙伴,egrep
确实只是grep -E
或grep --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