ここでは、XMLパーサーが理想的な方法であることを知っていますが、私の環境には何も使用可能または追加できません。
次の構造に従うXMLを見てみましょう。
<CONTAINER>
<FOLDER NAME="I_RS_INT">
</FOLDER>
<FOLDER NAME="I_R_INR">
</FOLDER>
<FOLDER NAME="I_RS_TRN">
</FOLDER>
</CONTAINER>
<FOLDER NAME=
Bashスクリプトで一致するすべてのノードを削除するか、*RS*
次のすべてのノードを削除したいと思います。<FOLDER NAME != $var_folder
どんな助けでも大変感謝します!
答え1
これにより、トリックを実行できます。
cat /tmp/xml | sed -e '/<FOLDER NAME=.*RS.*>/ { N; d; }'
2 文字間のパターンに一致する各行に対して/
{} 内のコードが実行されます。また、Nは次の行をパターン空間に入れ、次にdは次の行を続行する前に内容全体を削除する。これはすべてのPOSIX互換で機能しますsed
。
<FOLDER NAME=.*RS.*>
との間のすべての行を削除するには、以下を試してください</FOLDER.>
。
awk '/<FOLDER NAME=.*RS.*>/,/<\/FOLDER>/ {next} {print}' xmlfile
このnext
コマンドは現在の一致の処理を停止します。以下は簡単なものですprint
。
答え2
これを行うには、XMLパーサーを使用する必要があります。例えばXMLスターコマンドラインから:
$ xmlstarlet ed -d '/CONTAINER/FOLDER[contains(@NAME, "RS")]' data.xml
<?xml version="1.0"?>
<CONTAINER>
<FOLDER NAME="I_R_INR">
</FOLDER>
</CONTAINER>
または、
$ var="I_R_INR"
$ xmlstarlet ed -d "/CONTAINER/FOLDER[@NAME != '$var']" data.xml
<?xml version="1.0"?>
<CONTAINER>
<FOLDER NAME="I_R_INR">
</FOLDER>
</CONTAINER>
最初の例は部分文字列の一致を実行し、2番目の例は正確な一致を実行するため、これら2つの例は同じではありません。
xq
包装紙でjq
:
$ xq -x --arg substring "RS" 'del(.CONTAINER.FOLDER[] | select(."@NAME" | contains($substring)))' file.xml
<CONTAINER>
<FOLDER NAME="I_R_INR"></FOLDER>
</CONTAINER>
$ xq -x --arg name "I_R_INR" 'del(.CONTAINER.FOLDER[] | select(."@NAME" != $name))' file.xml
<CONTAINER>
<FOLDER NAME="I_R_INR"></FOLDER>
</CONTAINER>
答え3
さて、真剣に - 正規表現を使ってXMLを解析するのは悪いニュース。 XMLは正規言語ではないため、どの正規表現でもXMLを正しく処理できません。その結果、あなたが書くすべては悪く壊れやすいでしょう。
しかし、XML
正規表現に似ているということがありますxpath
。
問題を解決するには、次の手順を実行します。
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
#process the file as XML
my $twig = XML::Twig -> parsefile ( 'your_file.xml' );
#iterate 'FOLDER' elements
foreach my $folder ( $twig -> get_xpath ('//FOLDER' ) ) {
#delete any that regex match /RS/
if ( $folder -> att('NAME') =~ m/RS/ ) {
$folder -> delete;
}
}
#print the result.
$twig -> set_pretty_print('indented_a');
$twig -> print;
答え4
sed -r '/<FOLDER NAME=.*RS.*>/{ :X N; /<\/FOLDER>/d; bX }' file
<CONTAINER>
<FOLDER NAME="I_R_INR">
</FOLDER>
</CONTAINER>