Linux脚本将显示XML编码



我需要编写将显示XML编码属性的Linux脚本。

例如。用于文件

<?xml version="1.0" encoding="UTF-8"?>
<example>
    <foo/>
</example>

我想获得文本UTF-8

有什么建议?

grep -oP "encoding=["']([^"']+)" $file | head -1 | cut -c 11-

要使情况不敏感,必须将-i开关添加到grep

它考虑了'的使用情况,当没有新行时<?xml version="1.0" encoding="UTF-8"?><a b="" />之类的输入。

可以使用sed或 BASH_REMATCH,例如。BASH_REMATCH版本

read -r line < file && [[ $line =~ [E|e][N|n][C|c][O|o][D|d][I|i][N|n][G|g]="([^"]+) ]] && echo "${BASH_REMATCH[1]}"

另外,可以使用shopt -s nocasematch来忽略案例,以简单地bash正则。

使用 GNU sed 4.2.1

sed -n -e '/<?xml/{s/(<?xml[^>]*encoding=.)([^'"'"'"]*)(.*)/2/p;q0}' $f

说明:

  • -n:避免打印直到按程序订购
  • /<?xml/:包含序言的匹配行
  • s/:启动字符串替换
  • (<?xml[^>]*encoding=.):匹配序言直至开场报价,作为组1
  • ([^'"'"'"]*):将除"'作为组2
    以外的所有内容匹配(bashtcsh所需的逃脱)
  • (.*):匹配线的其余部分作为组3
  • /2/p;q0:用组 2替换匹配的零件,打印并退出

测试:

1: printf 'n<?xml ?><someElement encoding="someEncoding"/>n' | sed -n -e '/<?xml/{s/(<?xml[^>]*encoding=.)([^'"'"'"]*)(.*)/2/p;q0}'  
 > no output
2: printf 'n<?xml encoding="UTF-8"?><someElement encoding="someEncoding"/>n' | sed -n -e '/<?xml/{s/(<?xml[^>]*encoding=.)([^'"'"'"]*)(.*)/2/p;q0}'
 > UTF-8

我实际上是用它来代替所需的编码(ISO-8859-1):

sed -e '/<?xml/{s/(<?xml[^>]*encoding=.)([^'"'"'"]*)(.*)/1ISO-8859-13/}' utf8.xml > iso8859-1.xml

相关内容

  • 没有找到相关文章

最新更新