正则表达式:grep('pattern') 捕获 'pattern2'



我正在寻找逻辑解决方案,使用regex,这样我就可以在grep中查询pattern,而不捕获pattern2。某种"停止"或"直到"的逻辑。

这个问题是关于执行这种类型的查询,而不是关于命名约定。我不是在寻找变通方法,只是regexp逻辑。

为了便于讨论,让我们将上下文设置为"最新的"ubuntu bash。但我真正想要的是只使用regexp逻辑的东西。

对于以下列表

entry    
entry1    
entry2    
entry.qualifier    
entry.qualifier2 

伪命令:grep("entry")

注意,这将匹配所有条目,因为没有"停止"逻辑。我相信这个解决方案其实很简单,我只是很久没有使用regex了。

像"没有任何图案之后的东西"?

grep支持单词边界,因此纯基于正则表达式的答案是:

grep 'bentryb' file

但是grep也支持-w标志(匹配词),因此您也可以使用:

grep -w 'entry' file

如果您使用的是GNU grep,那么它支持的伤口边界锚运算符<>会对您有所帮助。也就是说<entry>

POSIX没有指定任何b<-w命令行选项。如果你必须使用没有它们的grep怎么办?这个问题可以通过用纯正则表达式测试文件的每一行来解决,纯正则表达式必须与它完全匹配。

假设我们要挑选包含标识符entry的行,该标识符不是较长标识符名称的子字符串。假设标识符是由英文字母、数字和下划线组成的字符串。我们可以使用这个:

grep -E '^(|.*[^A-Za-z_0-9])entry([^A-Za-z_0-9].*|)$'

请注意,整个阵列的两端都被锚定,因此它必须与整条线完全匹配。它匹配任何出现的entry,其中:

  • 前面没有任何内容,或者前面有一个非标识符字符,可能前面有其他字符;以及
  • 要么后面没有任何内容,要么后面跟着一个非标识符字符,可能后面跟着其他字符

如果您对"单词"的构成有特定的想法,而"单词"与GNU grep b<运算符使用的定义不同,那么这种方法也很有用。假设文件格式使得entry123实际上是两个不同的令牌entry123,因此必须匹配。但是entryabc必须而不是匹配。为此,GNU grep模式bentryb<entry>没有帮助;它将不匹配CCD_ 27。然而,上述技巧可以很容易地适应工作:

grep -E '^(|.*[^A-Za-z])entry([^A-Za-z].*|)$'

entry不包含任何内容,或者包含非大写或小写字母的字符。因此,这值得"放在你的后口袋里"。

最新更新