首页 > 解决方案 > 如何使用 look after 来匹配单引号或双引号?

问题描述

我有一系列要提取的字符串:

hello.this_is("bla bla bla")
some random text
hello.this_is('hello hello')
other stuff

我需要得到(从许多文件中,但这在这里并不重要)是 and 之间的内容hello.this_is()所以我想要的输出是:

bla bla bla
hello hello

如您所见,括号内的文本可以用双引号或单引号括起来。

如果这只是单引号,我会使用向后看并向前看,就像这样:

grep -Po "(?<=hello.this_is\(').*(?=')" file
#                            ^      ^
# returns ---> hello hello

同样,要从双引号中获取字符串,我会说:

grep -Po '(?<=hello.this_is\(").*(?=")' file
#                            ^      ^
# returns ---> bla bla bla

但是,我想匹配这两种情况,所以它同时得到单引号和双引号。我尝试使用$''转义,但无法使其工作:

grep -Po '(?<=hello.this_is\($'["\']').*(?=$'["\']')' file
#                            ^^^^^^^^      ^^^^^^^^

我当然可以使用 ASCII 数字并说:

grep -Po '(?<=hello.this_is\([\047\042]).*' file

但我想使用引号和单引号,因为047042对我来说并没有单引号和双引号那样有代表性。

标签: regexgrepgnu

解决方案


注意:sed此答案底部的命令仅适用于您的字符串表现良好的字符串,例如

"foo"

或者

'bar'

一旦你的字符串开始行为不端:)就像:

"hello \"world\""

它不再起作用了。

您的输入看起来像源代码。对于稳定的解决方案,我建议使用该语言的解析器来提取字符串。


对于琐碎的用例:

您可以使用sed. 该解决方案应该适用于任何 POSIX 平台,grep -oP而仅适用于 GNU grep:

sed -n 's/hello\.this_is(\(["'\'']\)\([^"]*\)\(["'\'']\).*/\2/gp' file
#                                    ^^^^^^^^              ^^
#                                          capture group 2 ^

推荐阅读