Xml Grep只需一行,然后删除

Xml Grep只需一行,然后删除,xml,bash,awk,sed,grep,xmllint,xmlstarlet,Xml,Bash,Awk,Sed,Grep,Xmllint,Xmlstarlet,我想知道一个命令,它只提取这个文件第8行的值,减去和,换句话说,只输出3.2.2 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>

我想知道一个命令,它只提取这个文件第8行的值,减去
,换句话说,只输出
3.2.2

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>BuildVersion</key>
    <string>8</string>
    <key>CFBundleShortVersionString</key>
    <string>3.2.2</string>
    <key>CFBundleVersion</key>
    <string>399.12</string>
    <key>ProjectName</key>
    <string>ServerApp</string>
    <key>SourceVersion</key>
    <string>399012000000000</string>
</dict>
</plist>

构建版本
8.
CbundleShortVersionString
3.2.2
循环流化床锅炉
399.12
项目名称
服务器应用
源版本
399012000000000
非常感谢您的建议!谢谢,丹

awk'NR==8,$0=$3'FS='[]
awk 'NR==8,$0=$3' FS='[<>]'
结果

3.2.2 3.2.2
  • 将字段分隔符设置为
  • 如果在第8行,则打印字段3

如和链接所述,要解析XML,需要一个合适的XML解析器,其中一个是

或与:

或与:

和更好的XPath表达式,如果您想在
CbundleShortVersionString
之后输入版本号:

'//key[text()="CFBundleShortVersionString"]/following-sibling::string[1]/text()'

使用
sed
可以按如下方式执行

$ sed -rn '8s#<[a-z]+>([0-9.]+)</[a-z]+>#\1#p' file.xml
3.2.2
$sed-rn'8s#([0-9.]+)#\1#p'file.xml
3.2.2

不要让我们计算,哪一行是第8行?要解析XML,请使用合适的XML解析器……谢谢Steven,这一行非常漂亮,而且最简洁。十分钟一到,我就把这个标记为已回答…使用xmllint和not
sed-n'8s\\.*>\([[:digit:.]\{1,\}\)点有什么意义呢..不过..你会得到同样的结果。xmllint对sed是用户友好的(不像cat),这就是为什么我喜欢使用它来打开xml文件meant@xorgsed将文件作为参数sup投票给最后一个表达式-CFBundleShortVersionString之后的值
$ saxon-lint --xpath '/plist/dict/string[2]/text()' file.xml
'//key[text()="CFBundleShortVersionString"]/following-sibling::string[1]/text()'
xmllint 'myfile'|sed -n '8 s#.*>\([[:digit:].]\{1,\}\)<.*#\1#p'
xmllint 'myfile'|sed -n 's#.*>\(3.2.2\)<.*#\1#p'
$ sed -rn '8s#<[a-z]+>([0-9.]+)</[a-z]+>#\1#p' file.xml
3.2.2