![如何引用 XML 标签内包含的特殊字符?](https://linux22.com/image/1180214/%E5%A6%82%E4%BD%95%E5%BC%95%E7%94%A8%20XML%20%E6%A0%87%E7%AD%BE%E5%86%85%E5%8C%85%E5%90%AB%E7%9A%84%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
是否可以通过简单的方法替换sed
限制在 2 个字符串内的字符串()?
例子
我的xml
feed 包含许多标签,包括<DESCRIPTION>
里面带有特殊字符的标签。
我需要更改特殊字符仅有的在此标签内。我的意思是,<
到<
,"
到"
,等等。
来源
<DESCRIPTION><p>Konvice s pokličkou smalt je vhodná ke každodennímu použití. Lze ji mýt v myčce na nádobí a je vhodná pro plynové, elektrické sporáky a indukci. Objem 2 l, v červené barvě s bílým puntíkem.</p><p> </p><p> </p></DESCRIPTION>
结果
<DESCRIPTION><p>Konvice s pokličkou smalt je vhodná ke každodennímu použití. Lze ji mýt v myčce na nádobí a je vhodná pro plynové, elektrické sporáky a indukci. Objem 2 l, v červené barvě s bílým puntíkem.</p><p> </p><p> </p></DESCRIPTION>
或者有另一种方法来“修复”这个 xml?
谢谢。
更新
它可以工作,但对于大多数 xml 标签来说,甚至对于 xml head 来说也是如此。:/
<?xml version="1.0" encoding="utf-8"?>
<SHOP><GENERATED>2021-02-05T14:15:02+01:00</GENERATED>
<SHOPITEM>
<ITEM_ID>ABF644B</ITEM_ID>
<PRODUCTNAME>LÁHEV NA VODU "BISFREE ECO" 550ML, HNĚDÁ</PRODUCTNAME>
<DESCRIPTION>Láhev na vodu "Bisfree Eco". Díky barevné plastové láhvi na vodu lock budete mít o množství vypitých tekutin přehled. Malá velikost s objemem 550 ml s víčkem se totiž vleze do každé tašky či kabelky a vodu tak můžete mít stále při sobě. Láhev je vyrobená z Tritanu - lehký, odolný proti nárazům a kvalitní plast - neobsahuje BPA. Tritan je populární náhražka skla. Barva hnědá. Rozměry - 6,5×6,5×22 cm</DESCRIPTION>
<URL>https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/</URL>
<IMGURL>https://b2b.utc.cz/bin/product/4/ABF644B.jpg</IMGURL>
<IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>
<ORIGINAL_PRICE_VAT>199.00</ORIGINAL_PRICE_VAT>
<PURCHASE_PRICE_VAT>164.46</PURCHASE_PRICE_VAT>
<MANUFACTURER>LOCKNLOCK</MANUFACTURER>
<CATEGORY>STOLOVÁNÍ | PŘÍPRAVA NÁPOJŮ | SPORTOVNÍ LAHVE</CATEGORY>
<EAN>8803733138772</EAN>
<ITEMGROUP_ID></ITEMGROUP_ID>
<PRICE_VAT>199.00</PRICE_VAT>
</SHOPITEM>
<SHOPITEM>
<ITEM_ID>ABF644G</ITEM_ID>
<PRODUCTNAME>LÁHEV NA VODU "BISFREE ECO" 550ML, ZELENÁ</PRODUCTNAME>
<DESCRIPTION>Láhev na vodu "Bisfree Eco". Díky barevné plastové láhvi na vodu lock budete mít o množství vypitých tekutin přehled. Malá velikost s objemem 550 ml s víčkem se totiž vleze do každé tašky či kabelky a vodu tak můžete mít stále při sobě. Láhev je vyrobená z Tritanu - lehký, odolný proti nárazům a kvalitní plast - neobsahuje BPA. Tritan je populární náhražka skla. Barva zelená. Rozměry - 6,5×6,5×22 cm</DESCRIPTION>
<URL>https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-zelena/347057p/</URL>
<IMGURL>https://b2b.utc.cz/bin/product/4/ABF644G.jpg</IMGURL>
<IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>
...
它应该是。
<?xml version="1.0" encoding="utf-8"?>
<SHOP><GENERATED>2021-02-05T14:19:48+01:00</GENERATED>
<SHOPITEM>
<ITEM_ID>ABF644B</ITEM_ID>
<PRODUCTNAME>LÁHEV NA VODU "BISFREE ECO" 550ML, HNĚDÁ</PRODUCTNAME>
<DESCRIPTION><p>Konvice s pokličkou smalt je vhodná ke každodennímu použití. Lze ji mýt v myčce na nádobí a je vhodná pro plynové, elektrické sporáky a indukci. Objem 2 l, v červené barvě s bílým puntíkem.</p><p> </p><p> </p></DESCRIPTION>
<URL>https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/</URL>
<IMGURL>https://b2b.utc.cz/bin/product/4/ABF644B.jpg</IMGURL>
<IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>
<ORIGINAL_PRICE_VAT>199.00</ORIGINAL_PRICE_VAT>
<PURCHASE_PRICE_VAT>164.46</PURCHASE_PRICE_VAT>
<MANUFACTURER>LOCKNLOCK</MANUFACTURER>
<CATEGORY>STOLOVÁNÍ | PŘÍPRAVA NÁPOJŮ | SPORTOVNÍ LAHVE</CATEGORY>
<EAN>8803733138772</EAN>
<ITEMGROUP_ID></ITEMGROUP_ID>
<PRICE_VAT>199.00</PRICE_VAT>
</SHOPITEM>
...
答案1
尝试一下,你需要安装recode
包:
sudo apt install recode
备份原始文件。
我目前已经实现了这个目标:
代码:
#!/bin/bash
# create a function to parse the files
f() {
# get the original text between the tags inside DESCRIPTION
decoded="$(sed -n '/<DESCRIPTION>/p;' "$1" | sed 's:<\([^>]*\)>::g' | sed 's/^[[:blank:]]*\|[[:blank:]]*$//g')"
# get the encoded text from the decoded text
encoded="$(echo "$decoded" | recode ..html | sed 's:<DESCRIPTION>\(.*\)</DESCRIPTION>:\1:')"
# encode everything inside DESCRIPTION to temporal file
awk '/DESCRIPTION/{"echo \""$0"\" | recode ..html" | getline $0;}1' "$1" > output.xml
# replace the encoded with the decoded
[[ ! -z "$encoded" ]] && sed -i "s/$encoded/$decoded/" output.xml
# decode DESCRIPTION tags
sed "s:<\([^;]*\)DESCRIPTION>:<\1DESCRIPTION>:g" output.xml >> result.xml
}
# create result file
> result.xml
# split the source file into <SHOPITEM> chunks
csplit --suffix-format="%d.FOO" file.xml '/<SHOPITEM>/' '{*}' 2>&1 > /dev/null
# loop over the "chunk" files
for i in *.FOO; do
# apply the function to the "chunk" file
f "$i"
# remove "chunk" file
rm "$i"
done
# remove temporal file
rm output.xml
然后:
$ cat result.xml
<?xml version="1.0" encoding="utf-8"?>
<SHOP><GENERATED>2021-02-05T14:19:48+01:00</GENERATED>
<SHOPITEM>
<ITEM_ID>ABF644B</ITEM_ID>
<PRODUCTNAME>LÁHEV NA VODU "BISFREE ECO" 550ML, HNĚDÁ</PRODUCTNAME>
<DESCRIPTION><p>Konvice s pokličkou smalt je vhodná ke každodennímu použití. Lze ji mýt v myčce na nádobí a je vhodná pro plynové, elektrické sporáky a indukci. Objem 2 l, v červené barvě s bílým puntíkem.</p><p> </p><p> </p></DESCRIPTION>
<URL>https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/</URL>
<IMGURL>https://b2b.utc.cz/bin/product/4/ABF644B.jpg</IMGURL>
<IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>
<ORIGINAL_PRICE_VAT>199.00</ORIGINAL_PRICE_VAT>
<PURCHASE_PRICE_VAT>164.46</PURCHASE_PRICE_VAT>
<MANUFACTURER>LOCKNLOCK</MANUFACTURER>
<CATEGORY>STOLOVÁNÍ | PŘÍPRAVA NÁPOJŮ | SPORTOVNÍ LAHVE</CATEGORY>
<EAN>8803733138772</EAN>
<ITEMGROUP_ID></ITEMGROUP_ID>
<PRICE_VAT>199.00</PRICE_VAT>
</SHOPITEM>