从 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
之后的 "
替换为 &quot;
,但对于 attr="bla"
部分保持原样......
有什么想法吗?
【问题讨论】:
我看不出在那里使用角色实体的理由。你为什么要这样做? 因为我正在转换此 xml 以进行进一步编辑,并且“在以后的解析中出现问题 ;) 没有正确运行的 XML 解析器应该有任何问题。 问题是它没有被xml解析器解析...我知道它不聪明但是因为项目的其他部分它不能被使用... 去打那个写“解析器”的人的脸,然后让他修复它。 【参考方案1】:这可能有效,但您应该使用正确的工具。
sed 's|</\?desc>|\n&|g; s/\(<desc>[^"]*\)"\([^\n]*\n\)/\1\"\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@"@\"@' <<<"$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;')" -n
【讨论】:
以上是关于从 XML 的值中删除或替换双引号(特定搜索和替换)的主要内容,如果未能解决你的问题,请参考以下文章