一部のファイルを自動的に更新しようとしています。行を見つけて、その行の後の一部の行を削除する必要があります。また、削除された行を代替行に置き換える必要があります。
たとえば、より明確になります。
オリジナル:
line aa/aa/aa/aa
line bb/bb/bb/bb
line cc/cc/cc/cc
line dd/dd/dd/dd
line ee/ee/ee/ee
line ff/ff/ff/ff
line gg/gg/gg/gg
line hh/hh/hh/hh
line ii/ii/ii/ii
だから私はこう考えました:
たとえば、検索パターンが
bb/bb/bb/bb
あるため、最初の2行を保持します。次の3〜6行を削除して交換します。
uu/uu/uu/uu
最終結果:
line aa/aa/aa/aa
line bb/bb/bb/bb
line cc/cc/cc/cc
line dd/dd/dd/dd
line uu/uu/uu/uu
line ii/ii/ii/ii
以下を使用して、次の行を見つけて削除できます。
sed -e '/pattern/{n;N;N;N;N;d}' file.txt
しかし、同時に新しい行を追加する方法がわかりません。私も一部を含めることに興味があります/
。
ベストアンサー1
〜のようにワイルドカードヒント、スクリプト可能なエディタを使用すると、これが簡単になります。パターンの後の3行目から6行目をbb/bb/bb/bb
1行に置き換えるには、line uu/uu/uu/uu
次のed
パイプを使用できます。
printf '%s\n' '/bb\/bb\/bb\/bb' '+3,+6c' 'line uu/uu/uu/uu' '.' 'wq' | ed -s file.txt > /dev/null
より高いレベルでは、改行で区切られたコマンドをパイプして名前付きed
ファイルを自動的に編集file.txt
し、すべての「標準出力」をbitbucketに入れるように指示します/dev/null
。このフラグは、読み込まれたバイト数と書き込みバイト数の一般的な出力を抑制します-s
。一致する行も印刷されるため(このシナリオでは「bb」行)、そのフラグを削除してstdoutとstderrをリダイレクトできます。ed
ed
> /dev/null
-s
コマンドed
自体は次のとおりです。
/bb\/bb\/bb\/bb
/bb/bb/bb/bb
- スラッシュをエスケープする必要がある場所を含む行を検索します。それ以外の場合は、スラッシュが構文文字であるため、一致する行に奇妙なコマンドを送信しようとしているed
と見なされます。bb/bb/bb
/bb/
+3,+6c
- この行から始めてc
3〜6行を後ろに歩いてください...line uu/uu/uu/uu
- この行に移動.
-ed
ライン交換が完了したことをお知らせします。wq
- 次に、w
ファイルをディスクに書き込んでインストールq
します。ed
これはbb/bb/bb/bb
ファイルに存在すると仮定します。それ以外の場合は、ed
ファイルの終了後に行3〜6を編集しようとするとエラーが発生します。パターンがファイルに存在するかどうかわからない場合は、このスクリプトの前に追加してgrep -q bb/bb/bb/bb file.txt && printf...
条件付きでパイプラインを実行できます。