ファイルがあります
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
すると、t
withタグはスクリプトの末尾に分岐するため、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"
上記のコマンドはうまく実行されます。