xml - Grep 仅一行,然后删除

标签 xml bash awk sed grep

我想知道一个命令来仅从该文件的第 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>

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

最佳答案

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

还有一个更好的 XPath 表达式,如果你想在 CFBundleShortVersionString 之后的版本号:

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

关于xml - Grep 仅一行,然后删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27475381/

相关文章:

java - 在类路径中找不到任何 META-INF/persistence.xml 文件 Java - Dynamic Web Project

bash - 将索引列添加到 CSV 文件

bash - 替换每个命令行参数中的文本,并将其传递给另一个命令

bash - 如何通过管道传输到 awk 脚本中

sed 或 awk 多行替换

java - 使用 xPath 从 xml 文件创建 Java 对象

java - Android 应用程序错误 - 很遗憾,您的应用程序已停止

java - Jackson 根据字段值添加包装器

linux - 从 bash shell 脚本中的整个字符串中提取路径

bash - 使用 grep 或类似工具获取模式 startindex