正则表达式在 Sed 中不起作用

Posted

技术标签:

【中文标题】正则表达式在 Sed 中不起作用【英文标题】:Regex not working in Sed 【发布时间】:2012-12-18 18:02:15 【问题描述】:

我正在尝试对 XML 文件(准确地说是 Jira 导出文件)运行正则表达式,以解决其中的一些 JQL 查询问题。

我正在寻找一个名为“request”的属性,它包含一个查询。在该查询中,用户名需要包含在 html 实体中以获取引号 ("quot;)。 用户名总是跟在字符串 "reporter = '、"assignee = " 或 "watcher = " 之后,除了一种特殊情况:字符串 currentUser() 不是用户名,不需要替换。

 Original:
 <SearchRequest id="10000" name="Example" author="myusername" user="myusername" request="reporter = anotheruser and status != Closed" favCount="1"/>
 Result:
 <SearchRequest id="10000" name="Example" author="myusername" user="myusername" request="reporter = &quot;anotheruser&quot; and status != Closed" favCount="1"/>

 Search:
 (request=".*?(reporter|assignee|watcher) = )(?!currentUser)([a-z.]+)(.*?")

 Replace:
 $1&amp;$3&amp;$4

这已经在 SublimeText 2 和Regex Tester 2 中进行了尝试和测试,并且可以正常工作。如您所见,它使用前瞻来检测 currentUser 的否定情况。现在,当我尝试在 Sed 中使用这个正则表达式时,它会出错:

$ sed -i '' -E 's/(request=".*?(reporter|assignee|watcher) = )(?!currentUser)([a-z.]+)(.*?")/$1&amp;$3&amp;$4/g' entities.xml
sed: 1: "s/(request=".*?(reporte ...": RE error: repetition-operator operand invalid

我不知道现在该怎么做,因为 sed 对我来说是一个新领域。我倾向于认为这是导致此问题的前瞻。也许有更简单的方法来满足这个要求?

【问题讨论】:

首先,在sed中,不是$1,$2,...而是\1,\2,... 另外,我不确定你的意思是什么:“。*?”。点星搜索 0 到多次出现的任何内容。问号是怎么回事? @StefanosKalantzis .* 是贪婪的,问号使它变得懒惰.*? 正如sudo_O所说,是为了让匹配变得懒惰。 searchRequest 中有更多的属性。如果没有惰性匹配,匹配会一直运行到最后一个属性的右引号。 【参考方案1】:

不幸的是,sed 不支持前瞻/后向,您应该在ssed(超级 sed)中采取很多措施。如果您想了解更多信息,这里是FAQ。

如果你熟悉的话,这也可以在perl 中完成,我不是(我标记为 perl 所以你应该得到一些帮助)。

-P 选项与grep 一起使用可验证您的匹配:

$ grep -Po '(request=".*?(reporter|assignee|watcher) = )(?!currentUser)([a-z.]+)(.*?")' <<< '<SearchRequest id="10000" name="Example" author="myusername" user="myusername" request="reporter = anotheruser and status != Closed" favCount="1"/>'
request="reporter = anotheruser and status != Closed"

【讨论】:

谢谢!使用 grep 验证会节省我很多时间!

以上是关于正则表达式在 Sed 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 sed 中使用反向引用正则表达式

具有捕获组的有效正则表达式,但 sed 脚本不起作用

Javascript 正则表达式(负)后视在 Firefox 中不起作用

工作正则表达式在 laravel 验证中不起作用

我的正则表达式在 C# 中不起作用

为啥加号运算符在 JavaScript 的正则表达式中不起作用? [复制]