如何在Grep中使用反向引用

11

我有一个带有反向引用的正则表达式,如何在bash脚本中使用它?

比如我想打印与(.*)匹配的内容。

grep -E "CONSTRAINT \`(.*)\` FOREIGN KEY" temp.txt 

如果将其应用于

CONSTRAINT `fk_dm` FOREIGN KEY

我想输出

fk_dm
2个回答

19
$ echo 'CONSTRAINT `helloworld` FOREIGN KEY' | grep -oP '(?<=CONSTRAINT `).*(?=` FOREIGN KEY)'
helloworld

-o, --only-matching       show only the part of a line matching PATTERN
-P, --perl-regexp         PATTERN is a Perl regular expression

(?=pattern)
    is a positive look-ahead assertion
(?!pattern)
    is a negative look-ahead assertion
(?<=pattern)
    is a positive look-behind assertion
(?<!pattern)
    is a negative look-behind assertion 

你能详细解释一下 ?<= 和 ?= 吗? - metdos
如果我想打印多个匹配项,我能做到吗? - metdos
你应该使用“替换”。 - kev
实际上,我注意到这将返回所有实例。 - metdos
很好的例子。如果您不介意,我需要复活它。 - jredd

-1
grep -E 'CONSTRAINT \`(.*)\` FOREIGN KEY' temp.txt 

1
你重复了OP的问题的一部分,只是更改了引号,在这种情况下没有任何影响。 - Dennis Williamson
他们这样做:OP问道“如何在bash脚本中使用它?”而单引号就是答案。 - Eugen Rieck
反引号在原始文本中被转义,因此它们不会被视为命令替换。 - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接