我正在尝试编写一个 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'
它对文件名中的字符(字母、数字、斜杠)做出一些假设——您可以随意将更多字符放入该组括号中。