ファイルに次のパターンがあるとします。
<directory number=133 name=var1>
<myfile name=test1 />
</directory>
今、私はそのパターンを
<directory number=133 myfile=test1 />
どうすればそれを行うことができsed
ますか?
ただし、Sedは複数行のものには適していません。
sed ':l;N;$!tl;N;s!<directory number=133 name=var1>[ ]*\n<myfile name=test1 />[ ]*\n</directory>!<directory numbe=133 myfile=test1 />!' input
このコマンドは、最初にループ内のすべてのファイルを読み取ります。
:l;N;$!tl;N; # label l, read line, while not eof jump to label l
:l
ラベルはどこにありますか。N
次の行を読み取り、それをbufferコマンドに追加します。$!
そうでないかどうかをテストします()!
ファイルの終わり($
)。t
最後のテストが成功した場合のコマンドのブランチです。t
に分岐するラベル名が続くため、tl
。最後N
に進む前に、最後の行をバッファに追加します。
s!regex!replace!
次に、基本的に質問の入力と一致し、substitute( )コマンドを使用して目的の出力に置き換えます。
すべての異なる番号と名前もキャプチャする場合:
sed ':l;N;$!tl;N;s!<directory number=\([0-9]*\) name=\([^>]*\)>[ ]*\n<myfile name=test1 />[ ]*\n</directory>!<directory number=\1 myfile=\2 />!' input