【问题标题】:Grep just one line, then removegrep 一行,然后删除
【发布时间】:2015-02-13 00:54:11
【问题描述】:

我想知道一个命令,只提取该文件第 8 行的值,减去 <string></string>,换句话说只输出 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行?
  • 要解析 XML,请使用适当的 XML 解析器...

标签: xml bash awk sed grep


【解决方案1】:

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()'

【讨论】:

  • 投票赞成最后一个表达式 - CFBundleShortVersionString 之后的值 :-)
【解决方案2】:
awk 'NR==8,$0=$3' FS='[<>]'

结果

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

RegEx match open tags except XHTML self-contained tags

【讨论】:

  • 感谢 Steven,这很好用,而且是最简洁的。我会在十分钟后将其标记为已回答...
【解决方案3】:
xmllint 'myfile'|sed -n '8 s#.*>\([[:digit:].]\{1,\}\)<.*#\1#p'

如果3.2.2 在文件中某处并且它是一个唯一值,您可以尝试 sed 之类的

xmllint 'myfile'|sed -n 's#.*>\(3.2.2\)<.*#\1#p'

【讨论】:

  • 使用 xmllint 而不是 sed -n '8 s#.*&gt;\([[:digit:].]\{1,\}\)&lt;.*#\1#p' file 有什么意义?听起来还是很奇怪,但少了
  • 点了..尽管如此..你会得到相同的结果。 xmllint 对 sed 用户友好(不像 cat),这就是我喜欢使用它的原因..:)
  • “不像猫”用于打开 xml 文件..我的意思是
  • @xorg sed 将文件作为参数
【解决方案4】:

使用sed 可以如下完成。

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

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多