ある行を別の行に置き換える

ある行を別の行に置き換える

ファイルがあります

Line 1
Line 2 MATCH
Line 3
Line 4
Line 1
Line 2 MATCH
Line 3
Line 4

それぞれのケースで「MATCH」と「Line 1」に行を変更したいと思います。私は別の質問を探してみましたが、一致する行が最後の行に移動し、最終出力を取得するために私のバージョンを再作成するコードをよく理解していません。たとえば、次のようになります。

Line 2 MATCH
Line 1
Line 3
Line 4
Line 2 MATCH
Line 1
Line 3
Line 4

答え1

sedそして使用N;P;D cycle:

sed -e '$!N;s/\(Line 1\)\(\n\)\(.*MATCH.*\)/\3\2\1/;t' -e 'P;D' infile

これは with 行MATCHの前に :: がある場合にのみ置き換えられます。成功Line 1すると、twithタグはスクリプトの末尾に分岐するため、Line 1後に連続する行がある場合は再置換を避けることができますMATCH。先行/末尾のスペースを調整する正規表現です。

答え2

行を前の行と置き換えることがアイデアである場合は、次のようにすることMATCHができます。

$ awk '!/MATCH/ { if (NR > 1) print prev; prev=$0} 
        /MATCH/ {print $0;} 
        END {print prev}' < file
Line 2 MATCH
Line 1
Line 3
Line 4
Line 2 MATCH
Line 1
Line 3
Line 4

スクリプトは前の行を保持し、prev一致しない行を印刷して更新します。パターンに一致する行では、現在の行を印刷し、次の行が印刷されるように変数に前の行を残します。

NR==1印刷する前の行がなく、スケジュールされたEND行を印刷するときの最初の行()の特別な場合。

答え3

使用ed:

$ printf 'g/MATCH/m-2\n,p\n' | ed -s file
Line 2 MATCH
Line 1
Line 3
Line 4
Line 2 MATCH
Line 1
Line 3
Line 4

このmコマンドは、現在の行を次の宛先アドレスに移動します。ここで一致するすべての行を探しますMATCH(前の正規表現はgこれを「グローバル」アクションにします)、各行に対して1行上に移動します(「この行の後に2行上」)。その効果は、このMATCH行が前の行と位置を変更することです。

編集スクリプトの最後の部分には、変更された,p編集バッファのみが表示されます。これはwq、変更された編集バッファを元のファイルに書き換えるなど、変更される可能性があります。

ファイルを編集するときはedきれいに見えますが、ファイル全体をメモリに読み込むため、大容量ファイルにはお勧めできません。

答え4

sed "s/line 2 match//g"|sed "s/line 1/line 2 match\n&/g"

上記のコマンドはうまく実行されます。

関連情報