デフォルトでは2つのファイルがあります。次のルータとスイッチのログインプロンプトのリストがあります。
user@router1
user@router2
user@switch1
user@switch2
別のファイルには、次のXMLチャンクがあります。
<headTag>
<anotherTag1>
<anotherTag2>
</anotherTag2>
</anotherTag1>
</headTag>
<headTag>
<anotherTag1>
<anotherTag2>
</anotherTag2>
</anotherTag1>
</headTag>
だから私がしたいのは、XMLファイルを繰り返し検索するたびに、<headTag>
ルーター/スイッチリストの次の項目をその上の行に配置することです。その後、最終出力は次のようになります。
user@router1
<headTag>
<anotherTag1>
<anotherTag2>
</anotherTag2>
</anotherTag1>
</headTag>
user@router2
<headTag>
<anotherTag1>
<anotherTag2>
</anotherTag2>
</anotherTag1>
</headTag>
この目標をどのように達成できますか?私はRed Hat Enterprise Linux Serverを使用しており、ルーター/スイッチのリストに約800個のエントリがあり、同じ数のXMLチャンクがあります。
答え1
XMLファイルを変更します。所定の位置に。コンソール出力を無視します。
sed -e 's#.*#/<headTag>/i\n&\n.\n//\nw#' PATH_TO_LIST_FILE | ed PATH_TO_XML_FILE
コマンドラインは、sed
リストファイルの各行に対して次のEdコマンドを作成します。
/<headTag>/i # search for tag and insert before
user@router1 # text to insert (= the current line in the list file)
. # end of insert
// # skip current tag (we are now on the line above the current tag))
w # save (could be postponed to the end, but makes the command shorter...)
<headTag>
このコマンドでは、常にxmlファイルの行の先頭になければなりません。
答え2
ここにあります:
perl -MTie::File -e '
$xml_file_name="path_to_xml_file";
$list_file_name="path_to_list_file";
tie @xml_lines,"Tie::File",$xml_file_name;
tie @list_lines,"Tie::File",$list_file_name;
@offsets = grep {$xml_lines[$_]=~/\Q<headTag>\E/} (0..$#xml_lines);
@offsets=reverse @offsets;
splice @xml_lines,pop @offsets,0,pop @list_lines;'
婦人声明
- このコードはXMLファイルをその場で変更します。元のファイルを削除したくない場合は、バックアップコピーを作成してください。
- このコードは未テスト。これを試みる前に、両方のファイルをバックアップしてください。
編集する
誤字修正:6行目に追加されたチルダを確認してください~
。