ファイル(シェルスクリプトコード)のテキストの塊を別のテキストの塊に置き換える必要があります。
私にとって印象的なことはsedを使用して複数行の文字列を置き換える方法は?回答者 アンタクそしてマルチライン交換回答者ブルース・エディガー
しかし、それらを使用するにはいくつかの問題があります。
アンタク彼の答えですでに述べたように、
1h;2,$H;$!d;g;
ファイル全体()をバッファにストリーミングすることはメモリに過負荷がかかるため、大容量ファイルにはお勧めできません。sed
ブロック外のテキストを変更せずにそのままにするために、ブロック機能で使用できることがわかります。この機能を使いたいです。しかし、私が使うなら、sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
各ストリームに繰り返し新しいテキスト(コード)を挿入します。そのため、提案のようなものを使用してビジュアルブロックをストリームにストリーミングする必要がありました。アンタク以前はブロック(フルファイルではありません)用でした。
言ったようにブルース・エディガー
ex
ドットで始まるアドインを試すことは可能ですが、新しいテキスト(コード)にはドットで始まる行が含まれており、これは追加の構文ではドットと見なすことができます。このような場合にはどのように使用する必要がありますか?a
.
ex
「行数dd
」は複数行を削除できますが、/marker1/と/marker2/の間に固定されていない(変更された)行数のブロックがあり、新しいテキスト(コード)に置き換えたい場合はどうすればよいですか?
ベストアンサー1
使用することをお勧めします氏hangeコマンド(デフォルトではDエレテプラスㅏ保留(追加は、目的の範囲の最後の行にのみ適用されますが)。
sed -i '/marker1/,/marker2/c\
New text 1\
New text 2' filename
sed
ここでは、内部編集()にGNU構文が使用されます-i
。それ以外の場合、コマンドはc
標準的で移植可能です。 GNUsed
サポート:
sed '/marker1/,/marker2/cNew text 1\
New text 2' filename
非標準拡張として。
改行およびバックスラッシュ文字は、代替テキストでエスケープ処理(バックスラッシュを使用)する必要があります。