0

我将用一个例子来说明我的问题。假设我们有包含以下字符串的文件名“file.txt”:

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

我想使用 grep 来查找所有以“A”开头并以“YZ”结尾但在“A”和“YZ”之间不包含“YZ”的子字符串。所需的输出将是:

AooYoZooYZ

啊啊啊啊啊

我最好的猜测是执行以下操作:

$grep -E -o 'A[^(YZ)]*YZ' file.txt

但输出只有:

啊啊啊啊啊

我希望括号保留它们对 YZ 的含义,但我在 GNU grep 手册(http://www.gnu.org/software/grep/manual/grep.html)中读到:“大多数元字符丢失它们在括号表达式中的特殊含义。” 我也试过:

$grep -E -o 'A.*YZ 文件.txt

但这会输出整行:

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

有没有办法覆盖这个或另一种解决我的问题的方法?

4

1 回答 1

0

也许您可以使用可在 Perl 正则表达式中使用的非贪婪匹配

echo 'AooYoZooYZoAoooooYZ' | grep -P -o 'A.*?YZ'

但是,请注意 GNU grep 的手册说 -P 选项是高度实验性的。

于 2013-08-22T02:44:24.483 回答