0

特定のグループからエントリを削除するシェル スクリプトを作成しています。例: ファイル名は 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" から node id="PQR" を持つ上記のファイル (ファイル名は dest.xml) からエントリを削除したい (group2 および group3 から削除されるべきではありません)。ファイルを順番に読み取り、特定のグループから削除することで実行できます。ただし、ファイルが大きすぎる場合 (> 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 に答える