ファイルに次のパターンがあるとします。
<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