我有一个 shell 脚本
string=<deploymentTargets xmi:type="appdeployment:ClusteredTarget" xmi:id="ClusteredTarget_143378365
7353" name="cluster1"/>
name="
我想要和之间的值"/>
是 cluster1。该输出应该存储到另一个变量中。
答案1
使用 GNU grep:
a="$(grep -oP 'name="\K[^"]*(?="/>)' file)"
echo "$a"
使用 GNU sed:
a="$(sed -E 's|.*name="([^"]*)"/>.*|\1|' file)"
echo "$a"
输出:
簇1
答案2
对于您显示的具体示例,所有这些都将保存cluster1
在变量中$name
:
sed
name=$(sed 's/.*="\(.*\)".*/\1/' <<<$string )
GNU
grep
(使用 PCRE 支持编译)name=$(grep -oP '[^"]+(?="/>)'<<<$string )
Perl
name=$(perl -pe 's/.*="(.*)".*/\1/' <<<$string )
如果您的不应支持该<<<
运营商,请更改您的首选方法以使用printf
或echo
改为:
name=$(printf '%s' "$string" | sed 's/.*="\(.*\)".*/\1/')
name=$(printf '%s' "$string" | grep -oP '[^"]+(?="/>)')
name=$(printf '%s' "$string" | perl -pe 's/.*="(.*)".*/\1/')
重要的: 这会仅有的根据您展示的示例进行操作。对于更复杂的 XML 结构,包括嵌套标签等,您确实应该使用专用的 XML 解析器。