我想搜索具有 [RT]"anything"D 的字符串,这意味着第一个字符可以是 R 或 T,下一个字符可以是任何字符,直到出现 D 为止我应该使用它是“egrep”吗?
答案1
如果您有 GNU grep 及其与 Perl 兼容的正则表达式 (PCRE) 支持(通过 启用-P
),那么您可以这样做:
grep -o -P 'RT.*?D' file
我们想要 PCRE 因为它有惰性量词( ?
) 我们可以与它一起使用.*
而不是.*
单独使用。后者很贪婪,会吞噬一切,直到最后的 D
...
$ grep -o 'RT.*D' <<< "JKIRTTHIUCDELKJUCDE"
RTTHIUCDELKJUCD
$ grep -o -P 'RT.*?D' <<< "JKIABTHIUCDELKJUCDE"
RTTHIUCD
哦,该-o
标志告诉grep
您仅打印一行的匹配部分,而不是打印整行的默认行为。
注意:这是从一个类似的、现在已关闭的重复问题合并而来的,该问题有一个重要的区别:模式的最后一部分是多字符,而不是D
这里的单个字符。单字符情况可以在没有 PCRE 的情况下处理(请参阅此处的其他答案),但多字符情况需要 BRE 或 ERE 语法不可用的功能。
答案2
正如评论所说。grep
足以完成这项工作。将您的模式写为[RT].*D
.
要获得 的首次外观D
,请使用[RT][^D]*D
.
由于问题中的“第一个字符”,我添加了一个插入符号。意识到这个短语可能意味着不同的东西后,我现在删除了插入符号。