sed - 匹配模式的反向引用不起作用

sed - Back reference on match pattern does not work

我需要在文件 (xml) 中找到这种格式 2021-06-25T21:17:51Z 的日期并用这种格式替换它们 2021-06-25T21:17:51.001Z

我考虑过将正则表达式与 sed 一起使用,但反向引用不起作用。

1.xml 可能看起来像这样,但我在这些文件中有更多的字段,而且我得到的字段已经正确了。

<Doc>
   <PUB_DATE>2021-06-25T21:17:51Z</PUB_DATE><!-- to change -->
   <DATE_COLLECT_100>2021-06-25T21:17:51Z</DATE_COLLECT_100><!-- to change -->

   <DATE_CREATION>2021-06-25T21:17:51.001Z</DATE_CREATION><!-- keep it like this -->
</Doc>

期望的输出是

<Doc>
   <PUB_DATE>2021-06-25T21:17:51.001Z</PUB_DATE><!-- to change -->
   <DATE_COLLECT_100>2021-06-25T21:17:51.001Z</DATE_COLLECT_100><!-- to change -->

   <DATE_CREATION>2021-06-25T21:17:51.001Z</DATE_CREATION><!-- keep it like this -->
</Doc>

这是我的 sed

$ sed -Ee 's#<(PUB_DATE|DATE_COLLECT_100){1}>([[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}T[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2})Z</>#<>.001Z</>#' 1.xml

正则表达式在 regex101

中似乎没问题

这里是用 https://regexper.com 制作的

在搜索部分使用反向引用时,sed 是否允许反向引用? 我是否缺少有关 sed 的内容? 有错误吗?

Sed 版本:嗯...我不知道,sed --version sed -v man sed 不给。我在 OSX.

BSD 或 OSX sed 不支持正则表达式模式中的 back-reference </code>。</p> <p>您的选择是<code>perl

perl -pe 's#<(PUB_DATE|DATE_COLLECT_100)>(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})Z</>#<>.001Z</>#' 1.xml

或者使用 home brew 安装程序安装 gnu sed,然后使用:

gsed -E 's#<(PUB_DATE|DATE_COLLECT_100)>([[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}T[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2})Z</>#<>.001Z</>#' 1.xml