0

我正在编写一个 shell 脚本来从特定组中删除一个条目。eg:文件名为dest.xml

<domain id="1" group_name="group1">
    <node id="ABC">
    <node id="PQR">
    <node id="XYZ">
</domain>
<domain id="2" group_name="group2">
    <node id="PQR">
    <node id="XYZ">
</domain>
<domain id="3" group_name="group3">
    <node id="ABC">
    <node id="PQR">
 </domain>

我想从 group_name="group1" 中删除节点 id="PQR" 的上述文件(文件名是 dest.xml)中的条目(它不应该从 group2 和 group3 中删除)。我可以通过顺序读取文件 n 然后从特定组中删除它来做到这一点。但是如果文件很大(>10k 行),那么它需要时间。

有什么简单的方法吗?

4

1 回答 1

1

您可以在中执行此操作:

echo '<domain id="1" group_name="group1">
    <node id="ABC">
    <node id="PQR">
    <node id="XYZ">
</domain>
<domain id="2" group_name="group2">
    <node id="PQR">
    <node id="XYZ">
</domain>
<domain id="3" group_name="group3">
    <node id="ABC">
    <node id="PQR">
 </domain>' | sed -e '/group_name="group1"/,/<\/domain>/ { /node id="PQR"/d; }'
<domain id="1" group_name="group1">
    <node id="ABC">
    <node id="XYZ">
</domain>
<domain id="2" group_name="group2">
    <node id="PQR">
    <node id="XYZ">
</domain>
<domain id="3" group_name="group3">
    <node id="ABC">
    <node id="PQR">
 </domain>

建议用法:

mv dest.xml dest.bak && sed -e '/group_name="group1"/,/<\/domain>/ { 
        /node id="PQR"/d; 
    }' dest.bak > dest.xml

科恩壳牌:

请注意,环境变量不会在单引号内展开。如果您希望将此命令嵌入脚本中,您需要为命令使用双引号,然后在程序中转义双引号:

#!/bin/ksh
gp_name=group1
entry=PQR
mv dest.xml dest.bak && sed -e "/group_name=\"${gp_name}\"/,/<\/domain>/ {
    /node id=\"${entry}\"/d;
}" dest.bak > dest.xml
于 2013-02-21T08:27:43.187 回答