1

ファイルに次のパターンがあるとします。

<directory number=133 name=var1> 
<myfile name=test1 /> 
</directory>

今、私はそのパターンを

<directory number=133 myfile=test1 />

どうすればそれを行うことができsedますか?

4

1 に答える 1

2

ただし、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
于 2013-01-07T07:43:23.577 に答える