sedまたはexを使用してブロック(複数行のコード)を新しいテキストブロック(コード)に置き換えるには?

sedまたはexを使用してブロック(複数行のコード)を新しいテキストブロック(コード)に置き換えるには?

ファイル(シェルスクリプトコード)のテキストの塊を別のテキストの塊に置き換える必要があります。

私にとって印象的なことはsedを使用して複数行の文字列を置き換える方法は?回答者 アンタクそしてマルチライン交換回答者ブルース・エディガー

しかし、それらを使用するにはいくつかの問題があります。

  1. アンタク彼の答えですでに述べたように、1h;2,$H;$!d;g;ファイル全体()をバッファにストリーミングすることはメモリに過負荷がかかるため、大容量ファイルにはお勧めできません。

  2. sedブロック外のテキストを変更せずにそのままにするために、ブロック機能で使用できることがわかります。この機能を使いたいです。しかし、私が使うなら、

    sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
    

各ストリームに繰り返し新しいテキスト(コード)を挿入します。そのため、提案のようなものを使用してビジュアルブロックをストリームにストリーミングする必要がありました。アンタク以前はブロック(フルファイルではありません)用でした。

  1. 言ったようにブルース・エディガーexドットで始まるアドインを試すことは可能ですが、新しいテキスト(コード)にはドットで始まる行が含まれており、これは追加の構文ではドットと見なすことができます。このような場合にはどのように使用する必要がありますか?a.

  2. 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

非標準拡張として。

改行およびバックスラッシュ文字は、代替テキストでエスケープ処理(バックスラッシュを使用)する必要があります。

おすすめ記事