我想知道一个命令,只提取此文件第8行的值,减去<string>
和</string>
,换句话说只输出3.2.2
< / p>
<?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>
非常感谢您的建议!谢谢,丹
答案 0 :(得分:9)
正如Steven Penny和链接RegEx match open tags except XHTML self-contained tags所述,要解析XML,需要一个合适的xml解析器,其中一个是xmllint
$ xmllint --xpath '/plist/dict/string[2]/text()' file.xml
$ xmlstarlet sel -t -v '/plist/dict/string[2]/text()' file.xml
$ saxon-lint --xpath '/plist/dict/string[2]/text()' file.xml
如果你想要CFBundleShortVersionString
之后的版本号,那就是更好的XPath表达式:
'//key[text()="CFBundleShortVersionString"]/following-sibling::string[1]/text()'
答案 1 :(得分:2)
awk 'NR==8,$0=$3' FS='[<>]'
结果
3.2.2
<
或>
答案 2 :(得分:1)
xmllint 'myfile'|sed -n '8 s#.*>\([[:digit:].]\{1,\}\)<.*#\1#p'
如果3.2.2
位于文件中的某个位置并且它是唯一值,您可以尝试使用
xmllint 'myfile'|sed -n 's#.*>\(3.2.2\)<.*#\1#p'
答案 3 :(得分:1)
使用sed
,可以按照以下方式完成。
$ sed -rn '8s#<[a-z]+>([0-9.]+)</[a-z]+>#\1#p' file.xml
3.2.2