ファイル内のテキストの大きなブロック(シェルスクリプトコード)を別のテキストブロックに置き換える必要があります。
sedを使用して複数行の文字列を置き換える方法に感銘を受けました。
antakとMulti-linereplaceが回答しました。BruceEdigerが回答しました
しかし、私はそれらを使用するのにいくつかの問題があります。
-
antakは、ファイル全体をストリーミングすることを彼の回答ですでに述べています(
1h;2,$H;$!d;g;
)メモリを過負荷にするため、大きなファイルの場合はバッファに接続することはお勧めしません。 -
sed
を知っています ブロック機能とともに使用して、ブロック外のテキストを変更せずに保持できます。この機能を使いたい。しかし、私が使用する場合、sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
ストリームごとに新しいテキスト(コード)を繰り返し挿入します。したがって、以前にantakが提案したものと同様のものを使用して、ビジュアルブロックを1つのストリームとして作成する必要がありますが、ブロック用です(ファイル全体ではありません)。
-
Bruce Edigerが述べたように、
ex
の機能を追加しますa
で始まる.
(ドット)を試すことはできますが、私の新しいテキスト(コード)にはドットで始まる行が含まれています。これは、追加構文のドットと見なすことができます。この状況でどのように使用できますか? -
ex
のdd
「行数」は複数の行を削除する可能性がありますが、/marker1/と/marker2/の間にブロックがあり、行数が固定されていない(変化している)場合、新しいテキスト(コード)に置き換えられます。どうすればよいですか?
承認された回答:
cを使用することをお勧めします hangeコマンド
(これは本質的に d aと組み合わせたelete ppend、ただし、appendは、ここで必要な範囲の最後の行にのみ適用されます):
sed -i '/marker1/,/marker2/c
New text 1
New text 2' filename
ここではGNUsed
を使用しています インプレース編集用のの構文(-i
)。そのc
それ以外の場合、コマンドは標準で移植可能です。 GNU sed
サポート:
sed '/marker1/,/marker2/cNew text 1
New text 2' filename
非標準の拡張機能として。
改行文字とバックスラッシュ文字は、置換テキストで(バックスラッシュを使用して)エスケープする必要があります。