grep 查找字符串中的单引号和双引号

grep 查找字符串中的单引号和双引号

我正在尝试编写一个 grep 来查找给定文件中的 .epl 文件名或文件路径。

我尝试过以下正则表达式

第 1 部分:使用 REGEX grep -rEco "/(.+).epl|(.+).epl" ./index.epl 获得结果

url => 'xyz.epl
url => 'xyz.epl
url => 'xyz.epl
url => "packet/xyz.epl
url => "/web/abc/xyz.epl
url => qq{/web/abc/xyz.epl
url => '/web/abc/def/xyz.epl
url => '/web/abc/def/xyz.epl
url => 'xyz.epl
url => 'xyz.epl
$url = "/web/abc/def/xyz.epl
var requestURL = "xyz.epl
var requestURL = "xyz.epl
<a style="float:left;" href="xyz.epl
[- Execute('components/xyz.epl
Welcome, <a href="xyz.epl
[- Execute('components/xyz.epl
<a href="xyz.epl
[- Execute(`'components/xyz.epl`

但是我希望它仅匹配以下内容(带或不带前面的引号)

'xyz.epl(OR xyz.epl)
'xyz.epl
'xyz.epl
"packet/xyz.epl(OR packet/xyz.epl)
"/web/abc/xyz.epl(OR "/web/abc/xyz.epl)
/web/abc/xyz.epl
'/web/abc/def/xyz.epl
'/web/abc/def/xyz.epl
'xyz.epl
'xyz.epl
"/web/abc/def/xyz.epl
"xyz.epl
"xyz.epl
"xyz.epl
'components/xyz.epl
"xyz.epl
'components/xyz.epl
"xyz.epl
'components/xyz.epl

为了获得所需的结果,我尝试了grep -rEoc '\/(.+)\.epl|[\"\'](.+)\.epl'但是它给了我一个“无与伦比的”。错误。

我删除了正则表达式周围的引号,然后得到“错误放置 ()”。

答案1

我想这会为你做的:

grep -oP "(?<=['\"]|qq{)[xp/c][^\`]+" ./index.epl

这说:

-o只保留匹配的部分。
-P使用 Perl 风格的正则表达式(我们需要这个用于后向查找)
"..."使用双引号,因为您无法转义单个内的单个
(?<=...)启动一个正向后向组。这意味着无论我们匹配多少,前面也有这个模式,但“之前的部分”不是我们想要保留的模式的一部分。
[\'\"]匹配以下之一:单引号或双引号
|qq{或匹配文字字符串 'qq{'
一旦找到该模式匹配:
[xp/c]匹配 x、p、/ 或 c 之一。 (这不太好,但您需要检查少量情况。)
[^]+` 任何不是反引号的内容,1 次或多次

编辑:如果您希望单引号或双引号成为模式的一部分,那么这会有点棘手,因为您似乎不希望以qq{任何方式包含它们。

答案2

给定您的示例输入,这会产生您想要的输出:

grep -Eo '["'\'']?[/[:alnum:]]+\.epl'

它对文件名中的字符(字母、数字、斜杠)做出一些假设——您可以随意将更多字符放入该组括号中。

相关内容