Regex:以一个特定的东西结尾

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 或

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

我试过:
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
。Plain
grep
使用了一种简单得多的正则表达式语法,它不允许使用某些您可能想要使用的运算符。值得注意的是,在plain
grep
中,括号和
只是普通字符,而不是用于分组的特殊元字符,因此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