我正在寻找逻辑解决方案,使用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
实际上是两个不同的令牌entry
和123
,因此必须匹配。但是entryabc
必须而不是匹配。为此,GNU grep模式bentryb
或<entry>
没有帮助;它将不匹配CCD_ 27。然而,上述技巧可以很容易地适应工作:
grep -E '^(|.*[^A-Za-z])entry([^A-Za-z].*|)$'
即entry
不包含任何内容,或者包含非大写或小写字母的字符。因此,这值得"放在你的后口袋里"。