我需要编写将显示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
以外的所有内容匹配(bash
和tcsh
所需的逃脱) -
(.*)
:匹配线的其余部分作为组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