XMLファイルから行を削除する方法

XMLファイルから行を削除する方法

xmlファイルから1行だけ削除する方法(sed / awkまたはperlを使用する1行)

それは次から始まります:

<units> 

そして終わる

</Networks>

次のように

<units><unit ip= ............   </units><ranges/></Networks>

答え1

XMLを解析するために正規表現を使用しないでください。これは、正規表現を破るXMLを使用して完全に有効な操作をたくさん実行できるため、壊れやすいコードを作成するのに最適な方法です。完全に有効な方法でXMLを再フォーマットすること(たとえば、入れ子にした/インデントする形式で「きれいに印刷する」)は、コードを破損します。

代わりにXMLパーサーを使用することをお勧めします。個人的に私は好きですXML::TwigPerlのモジュール。

<Networks>あなたのコメントは、XMLの要素にコンテンツを追加しようとしていることを示します。

では、次のようなものはどうでしょうか?

#!/usr/bin/perl
use strict;
use warnings;

use XML::Twig;

my $xml_text = '<XML>
<Networks><units><unit ip="1.2.3.4" /></units><ranges/></Networks>
</XML>';

my $parser = XML::Twig->new( 'pretty_print' => 'indented' );
#would probably use 'parsefile' instead here
$parser->parse($xml_text);

print "\nBefore:\n";
$parser->print;


#insert a new element into 'Networks':
$parser->root->first_child('Networks')->insert_new_elt(
        'last_child',     #position - end of "Networks" element
        'new_element',    #element
        {   'attribute_here'    => "value_here",
            'another_attribute' => 'another_value',
        },                 #attributes as key value pairs
        "Content_here",    #element content
    );


print "\nAfter:\n";
$parser->print;

答え2

この試み:

perl -i -pe 's|^<units>.*</Networks>$||' /my/filename

行に先行または末尾のスペースがある場合は、次のものが必要です。

perl -i -pe 's|^ *<units>.*</Networks> *$||' /my/filename

不要な脱出を避けるために、スラッシュの代わりにパイプを区切り記号として使用します。

答え3

これによりXMLが破損することがわかっているので、次のいずれかを使用して目的のタスクを実行できます。

  1. 真珠

    perl -ne 'print unless m#^<units>.*</Networks>$#' file.xml 
    perl -ne 'm#^<units>.*</Networks>$# ? next : print' file.xml 
    
  2. アッ

    awk '!/^<units>.*<\/Networks>$/' file.xml 
    
  3. sed

    sed '/^<units>.*<\/Networks>$/d' file.xml 
    
  4. grep

    grep -Ev '^<units>.*<\/Networks>$' file.xml 
    
  5. Bash(およびzsh)、完了用

    while read -r line; do 
        [[ "$line" =~ ^\<units\>.*\<\/Networks\>$ ]] || printf "%s\n" "$line"
    done < file.xml 
    

関連情報