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
我需要在文件 (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