【问题标题】:Remove or replace double quotes from values of XML (specific search and replace)从 XML 的值中删除或替换双引号(特定搜索和替换)
【发布时间】:2011-07-14 10:59:09
【问题描述】:

我有以下 XML:

<smtng attr="bla"><desc>bla 12" bla</desc></smtng>

我想使用一些命令(最好是从 bash 中执行)将 12 之后的 " 替换为 &amp;quot;,但对于 attr="bla" 部分保持原样......

有什么想法吗?

【问题讨论】:

  • 我看不出在那里使用角色实体的理由。你为什么要这样做?
  • 因为我正在转换此 xml 以进行进一步编辑,并且“在以后的解析中出现问题 ;)
  • 没有正确运行的 XML 解析器应该有任何问题。
  • 问题是它没有被xml解析器解析...我知道它不聪明但是因为项目的其他部分它不能被使用...
  • 去打那个写“解析器”的人的脸,然后让他修复它。

标签: xml bash search replace quotes


【解决方案1】:

这可能有效,但您应该使用正确的工具。

sed 's|</\?desc>|\n&|g; s/\(<desc>[^"]*\)"\([^\n]*\n\)/\1\&quot;\2/g;s/\n//g' inputfile

【讨论】:

    【解决方案2】:
    #!/bin/bash
    
    sed -e $'s@<desc>@\\\n<desc>@' -e  $'s@</desc>@</desc>\\\n@' | \
    while IFS=$'\n\r' read line; do
      case "${line}" in
        *"<desc>"*)
        sed 's@"@\&quot;@' <<<"${line}"
        ;;
    
        *)
        echo "${line}"
        ;;
      esac
    done
    

    出于懒惰,我编辑了我之前的答案以单独一行

    【讨论】:

    • 更新了我的,输出实际上在不同的行上有 desc ......这也可以修复......原则上我认为丹尼斯的答案更好,但如果你想要易读性,这可能是更容易
    • 再编辑 - 不知何故我错过了“替换(我以为它被剥离了)
    【解决方案3】:

    使用 xmlstarlet 您可以执行以下操作:

    # cf. http://www.exslt.org/str/index.html
    echo '<smtng attr="bla"><desc>bla 12" bla</desc></smtng>'  | 
    xmlstarlet sel -T -t -m "//smtng/desc" -v "str:replace(.,'&quot;','&amp;quot;')" -n
    

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多