一部のファイルを自動的に更新しようとしています。行を見つけて、その行の後の一部の行を削除する必要があります。また、削除された行を代替行に置き換える必要があります。
たとえば、より明確になります。
オリジナル:
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...
条件付きでパイプラインを実行できます。
答え2
そして牛に似た一種の栄養 sed
:
sed -ne '\#bb/bb/bb/bb#{p;n;p;n;p;n;n;n;n;a line uu/uu/uu/uu' -e ';b };p' file.txt
出力:
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
出力を次に保存ファイル.txtに変更-ne
。-ine
注:2つのスイッチを持つコードの間隔-e
は間隔ですa
未定追加を停止するコマンドです。
別の方法はPOSIX sed
しかし、これは単純な文ではありません。
sed -n '\#bb/bb/bb/bb#{p;n;p;n;p;n;n;n;n;a\
line uu/uu/uu/uu
b };p' file.txt
答え3
POSIXでは、sed
次のことができます。
$ sed -e '
\:line bb/bb/bb/bb:!b
n;n;n
N;N;N
s:.*:line uu/uu/uu/uu:
' inp
ターゲットラインと続く2つのラインを印刷したら、パターンスペースに次の3つのラインを累積し、パターンスペース全体を予想ラインに変更します。パターン空間を標準出力にインポートすると、改行文字は sed 自体で処理されます。
失敗しないように、ターゲット行の後に十分な行があるとしますN
。