首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何引用XML标记中包含的特殊字符?

我如何引用XML标记中包含的特殊字符?
EN

Ask Ubuntu用户
提问于 2021-02-04 12:01:26
回答 1查看 568关注 0票数 0

可以通过简单的方式替换字符串(sed)限制在两个字符串内吗?

示例

我有xml提要包含许多标签,包括带有特殊字符的标签。

我只需要在这个标记中更改特殊字符。我的意思是<<""等等。

<#>来源

代码语言:javascript
复制
    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.  

<#>结果

代码语言:javascript
复制
    <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>

或者是另一种“修复”xml的方法?

谢谢。

<#>更新

它可以工作,但是对于大多数xml标记,甚至对xml也是如此。:/

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
2021-02-05T14:15:02+01:00


    ABF644B
    LÁHEV NA VODU "BISFREE ECO" 550ML, HNĚDÁ
    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
    https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/
    https://b2b.utc.cz/bin/product/4/ABF644B.jpg
    
    199.00
    164.46
    LOCKNLOCK
    STOLOVÁNÍ | PŘÍPRAVA NÁPOJŮ | SPORTOVNÍ LAHVE
    8803733138772
    
    199.00


    ABF644G
    LÁHEV NA VODU "BISFREE ECO" 550ML, ZELENÁ
    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
    https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-zelena/347057p/
    https://b2b.utc.cz/bin/product/4/ABF644G.jpg
    
...

应该是这样的。

代码语言:javascript
复制
2021-02-05T14:19:48+01:00

    ABF644B
    LÁHEV NA VODU "BISFREE ECO" 550ML, HNĚDÁ
    <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>
    https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/
    https://b2b.utc.cz/bin/product/4/ABF644B.jpg
    
    199.00
    164.46
    LOCKNLOCK
    STOLOVÁNÍ | PŘÍPRAVA NÁPOJŮ | SPORTOVNÍ LAHVE
    8803733138772
    
    199.00

...
EN

回答 1

Ask Ubuntu用户

发布于 2021-02-04 13:17:23

尝试一下,您需要安装recode包:

代码语言:javascript
复制
sudo apt install recode

Make是原始文件的备份。

到目前为止,我已经做到了这一点:

守则:

代码语言:javascript
复制
#!/bin/bash

# create a function to parse the files
f() {
  # get the original text between the tags inside DESCRIPTION
  decoded="$(sed -n '//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  chunks
csplit --suffix-format="%d.FOO" file.xml '//' '{*}' 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

然后:

代码语言:javascript
复制
$ cat result.xml
代码语言:javascript
复制
2021-02-05T14:19:48+01:00

    ABF644B
    LÁHEV NA VODU "BISFREE ECO" 550ML, HNĚDÁ
    <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>
    https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/
    https://b2b.utc.cz/bin/product/4/ABF644B.jpg
    
    199.00
    164.46
    LOCKNLOCK
    STOLOVÁNÍ | PŘÍPRAVA NÁPOJŮ | SPORTOVNÍ LAHVE
    8803733138772
    
    199.00
票数 1
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1313562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档