1

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

我正在寻找一个名为“request”的属性,它包含一个查询。在该查询中,用户名需要包含在 HTML 实体中作为引号 ("quot;)。用户名始终遵循字符串 "reporter = '、"assignee = " 或 "watcher = ",除了一种特殊情况: string 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 对我来说是新领域。我倾向于认为这是导致此问题的前瞻。也许有更简单的方法来满足这个要求?

4

1 回答 1

2

不幸的是,不支持前瞻/落后,你应该在(超级 sed)sed上花很多时间。如果您想了解更多信息,ssed这里是常见问题解答。

如果你熟悉的话,也可以这样做perl,我不熟悉(我用标记, 所以你应该得到一些帮助)。

使用-P选项 withgrep验证您的匹配:

$ 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"
于 2013-01-04T10:08:54.967 回答