【问题标题】:shell with xml, grep and sed带有 xml、grep 和 sed 的 shell
【发布时间】:2013-01-22 10:05:34
【问题描述】:

在为我的问题搜索了很多解决方案之后,我终于必须问它并尝试得到一些很好的答案

所以,我有一个喜欢的 xml 文件

< trigger name="ECUReset" value="0x11">
...
< /trigger>
< trigger name="ClearDTC" value="0x14">
...
< /trigger>

我想用 shell 脚本解析它并检索trigger name,它是关联数组中的value,或接近perl hashes的东西

我机器上可用的工具只有grepsed,我没有perlawk

我现在设法得到的是

trigger_name=$(sed -n '/trigger_name=/ s/[^\x22]*\x22\(\x22*\)//p' $FILENAME)

但这并没有返回我想要的

我不能使用 perl,但我肯定会喜欢,因为我是 perl 开发人员,也没有 awk 或其他东西,只是用 sed 和 grep 做 shell。

【问题讨论】:

  • 如果您不是在寻找 perl 解决方案,为什么要包含 perl 标签?
  • @Dmitry,不,不幸的是,shell、sed 和 grep 是我唯一可以使用的工具,
  • 你能粘贴预期的输出吗?

标签: xml shell sed grep


【解决方案1】:

如果您有 cut 实用程序:

$ grep "< trigger" test.xml \
> | cut --delimiter=" " --fields=3,4 \
> | cut --delimiter='"' --fields=2,4 --output-delimiter=" : "
ECUReset : 0x11
ClearDTC : 0x14

【讨论】:

    【解决方案2】:

    这对你有用吗? (仅使用 sed)

    sed -rn '/trigger name/{s/.*trigger name="([^"]*)" value="([^"]*)".*$/\1=\2/g;p}' file
    

    测试

    kent$  echo '< trigger name="ECUReset" value="0x11">
    ...
    < /trigger>
    < trigger name="ClearDTC" value="0x14">
    ...
    < /trigger>'|sed -rn '/trigger name/{s/.*trigger name="([^"]*)" value="([^"]*)".*$/\1=\2/g;p}'                                                                              
    ECUReset=0x11
    ClearDTC=0x14
    

    【讨论】:

      【解决方案3】:
      grep 'trigger name' your_file| cut -d'"' -f 2,4|sed 's/\"/ /g'
      

      测试:

      >cat temp
      < trigger name="ECUReset" value="0x11">
      ...
      < /trigger>
      < trigger name="ClearDTC" value="0x14">
      ...
      < /trigger>
      > grep 'trigger name' temp | cut -d'"' -f 2,4 | sed 's/\"/ /g'
      ECUReset 0x11
      ClearDTC 0x14
      

      【讨论】:

        【解决方案4】:

        只使用sed:

        # names
        $ sed -n 's/< trigger name="\([^"]*\).*/\1/p' file
        ECUReset
        ClearDTC
        
        # values
        $ sed -n 's/< trigger.*value="\([^"]*\).*/\1/p' file
        0x11
        0x14
        
        # both
        $ sed -n 's/.*< trigger name="\([^"]*\).*value="\([^"]*\).*/\1 \2/p' file
        ECUReset 0x11
        ClearDTC 0x14
        

        【讨论】:

        • 嗨,感谢您的回复,但由于某种原因,这些命令都没有返回任何内容
        • 脚本是可移植的,因此可以与sed 的任何实现一起使用,因此这意味着您发布的示例与您的实际文件不同。确保您的示例代表您的文件正确,以便我可以相应地更新正则表达式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 2017-09-08
        • 2010-11-29
        • 2011-01-17
        • 2013-10-19
        • 1970-01-01
        相关资源
        最近更新 更多