8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

NerdyStudent 1月前

15 0

我需要在文件(xml)中查找这种格式的日期 2021-06-25T21:17:51Z 并将其替换为这种格式 2021-06-25T21:17:51.001Z 我考虑过将正则表达式与 sed 一起使用,但反向引用不起作用...

我需要在文件(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</\1>#<\1>\2.001Z</\1>#' 1.xml

中似乎没问题 regex101

制作的表示。 https://regexper.com representation of the regexp

当在搜索部分使用 sed 时,是否允许反向引用?我是否遗漏了什么 sed ?是否存在错误?

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

帖子版权声明 1、本帖标题:sed - 匹配模式的反向引用不起作用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由NerdyStudent在本站《regex》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您的“保持原样”行与其他行的修改完全相同,因此它不是测试潜在解决方案的好例子,因为我们无法从输出中判断脚本是否对其进行了修改。

  • BSD 或 OSX sed 不支持正则 \1 表达式模式中的反向引用。

    您的选择是 perl

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

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

    gsed -E 's#<(PUB_DATE|DATE_COLLECT_100)>([[: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 不是。

返回
作者最近主题: