从 XML 的值中删除或替换双引号(特定搜索和替换)

Posted

技术标签:

【中文标题】从 XML 的值中删除或替换双引号(特定搜索和替换)【英文标题】:Remove or replace double quotes from values of XML (specific search and replace) 【发布时间】: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解析器解析...我知道它不聪明但是因为项目的其他部分它不能被使用... 去打那个写“解析器”的人的脸,然后让他修复它。 【参考方案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

【讨论】:

以上是关于从 XML 的值中删除或替换双引号(特定搜索和替换)的主要内容,如果未能解决你的问题,请参考以下文章

用其他东西替换或删除新行,但只能在 CSV 文件上使用 PHP 的单引号或双引号之间

shell中,如何替换双引号中内容为某个变量?

用 \' 或 \" 替换每个单引号/双引号

在informix中将一个引号符号替换为两个引号

Powershell用双引号和新行替换

如何用单引号替换双引号 [关闭]