Regex:以一个特定的东西结尾
我试图找到一个以Hello开头,以两种方式之一结尾的表达式:“Hello”后面没有任何内容,或者如果它后面有其他内容,则需要在前面加“/”。在//之后,任何事情都会发生 我试过:Regex:以一个特定的东西结尾,regex,bash,terminal,Regex,Bash,Terminal,我试图找到一个以Hello开头,以两种方式之一结尾的表达式:“Hello”后面没有任何内容,或者如果它后面有其他内容,则需要在前面加“/”。在//之后,任何事情都会发生 我试过:grep'^Hello(//.*)?$”但这不起作用。 最后一部分有问题:(//.*)$ 鉴于: 使用grep: $ echo "$txt" | grep -E '^Hello$|^Hello[[:space:]]+//' Hello Hello // Hello // blah blah Hello //blah 或
grep'^Hello(//.*)?$”
但这不起作用。最后一部分有问题:
(//.*)$
鉴于:
使用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:]]+'
使用egrep的“仅匹配整行”选项(-x
)。然后查找可选的空白(
[:space:]*
),两个转义的/
(\/\/
)后跟任何内容或任何内容,*
使用可选说明符和括号允许特殊结尾,而不需要(
(…)?
)
这对于egrep来说非常简单:
egrep '^Hello(\s*\/\/.*)?$' input.txt
即:
-强制匹配从行首开始^…
-明确匹配所需短语Hello
Hello
-允许在(\s*…)
后面加可选空格Hello
-匹配正斜杠,并对其进行转义(因为有些shell可以对正则表达式执行有趣的操作)(…\/\/…)
-允许斜杠后面的任何内容(…..*)
-问号表示括号中的部分是可选的(…)?
$代码>-强制正则表达式仅在其通过行末尾使用时匹配
grep
而不是egrep
。Plaingrep
使用了一种简单得多的正则表达式语法,它不允许使用某些您可能想要使用的运算符。值得注意的是,在plaingrep
中,括号和?
只是普通字符,而不是用于分组的特殊元字符,因此plain grep在文件中搜索文本(
和)
。如有疑问,请选择egrep
(是的,对于观众中的学究来说,
egrep
实际上只是grep-E
或grep-extended regexp
的一个替代名称,但它比其他两种“本机”形式更容易记住和键入egrep
。awk '/^Hello$/||/\/\//' file
Hello
Hello //
Hello // blah blah
Hello //blah
最好包括样本输入和预期输出。包括类似但不应匹配的示例输入。“祝你好运!”谢尔特编辑道。希望这能把事情弄清楚。事情怎么会一事无成呢?你是说空白吗?@Yunnosch很抱歉这个奇怪的措辞,基本上是的。“基本上”。请解释,阅读和阅读。还请解释它如何“不起作用”。并给出更多应匹配和不应匹配的示例。注意:这将在
//
之后匹配Hello//
,因为*
结尾处的意思是0或更多。她的示例输出(现在)将Hello//
作为预期结果的一部分,因此我认为这是她想要的行为。
egrep -x "Hello([[:space:]]*\/\/.*)?"
egrep '^Hello(\s*\/\/.*)?$' input.txt
awk '/^Hello$/||/\/\//' file
Hello
Hello //
Hello // blah blah
Hello //blah