<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</\1>#<\1>\2.001Z</\1>#' 1.xml
POSIX 在 BRE 而不是 ERE 中定义反向引用,并且您调用 sed 来 -E 启用 ERE,因此结果是根据 POSIX 未定义的行为,因此对于任何给定工具将如何处理,YMMV 都是如此。
您不需要一个复杂的脚本来处理您显示的输入,例如使用任何支持带有参数的 ERE 的 sed -E (例如 GNU 和 BSD sed):
$ sed -E 's/(<(PUB_DATE|DATE_COLLECT_100)>.*:[0-9]+)Z/\1.001Z/' file
<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>
如果您的实际输入比这更复杂/多变,那么您应该使用 XML 感知工具,例如 xmlstarlet 而 sed 不是。