Grep只有一行,然后删除

时间:2014-12-14 23:34:23

标签: xml bash awk sed grep

我想知道一个命令,只提取此文件第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>

非常感谢您的建议!谢谢,丹

4 个答案:

答案 0 :(得分:9)

正如Steven Penny和链接RegEx match open tags except XHTML self-contained tags所述,要解析XML,需要一个合适的xml解析器,其中一个是

$ xmllint --xpath '/plist/dict/string[2]/text()' file.xml

$ xmlstarlet sel -t -v '/plist/dict/string[2]/text()' file.xml

saxon-lint

$ 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
  • 将字段分隔符设置为<>
  • 如果在第8行,请打印Field 3

RegEx match open tags except XHTML self-contained tags

答案 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