在 Mac 上的 bash 中从 xml 中提取值

mle*_*les 5 regex xml bash grep

我需要从此 xml 中提取名称值(产品查找器):

文件:config.xml

<?xml version="1.0" encoding="utf-8"?>
<widget id="com.abc.app" version="1.3.1" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0" ios-CFBundleVersion="1.3.1.5" android-versionCode="5">
    <name>Product Finder</name>
    <description>
        Description
    </description>
</widget>
Run Code Online (Sandbox Code Playgroud)

我试过了:

mles$ cat config.xml | grep '<name>'
    <name>Product Finder</name>
Run Code Online (Sandbox Code Playgroud)

其他一些答案建议使用grep -oPm1 "(?<=<xmltag>)[^<]+",但这会产生错误:

mles$ cat config.xml | grep -oPm1 "(?<=<name>)[^<]+"
usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
[-e pattern] [-f file] [--binary-files=value] [--color=when]
[--context[=num]] [--directories=action] [--label] [--line-buffered]
[--null] [pattern] [file ...]
Run Code Online (Sandbox Code Playgroud)

如何获取名称值?我需要一个没有依赖关系的解决方案,所以grep会是首选

Rog*_*gus 4

grep只找到该行,您必须使用附加工具来提取名称,例如sed(不是附加依赖项):

grep '<name>' config.xml | sed "s@.*<name>\(.*\)</name>.*@\1@"
Run Code Online (Sandbox Code Playgroud)

这里的作用sed是获取<name></name>标签之间的所有内容并用标签之间找到的文本替换整行

  • 当您可以使用“xmllint”或“xmlstarlet”时,为什么人们会推荐非 XML 感知工具 (3认同)