GNU/Linux >> Linux の 問題 >  >> Linux

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

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

sedを使用して複数行の文字列を置き換える方法に感銘を受けました。
antakとMulti-linereplaceが回答しました。BruceEdigerが回答しました

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

  1. antakは、ファイル全体をストリーミングすることを彼の回答ですでに述べています(1h;2,$H;$!d;g; )メモリを過負荷にするため、大きなファイルの場合はバッファに接続することはお勧めしません。

  2. sedを知っています ブロック機能とともに使用して、ブロック外のテキストを変更せずに保持できます。この機能を使いたい。しかし、私が使用する場合、

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

ストリームごとに新しいテキスト(コード)を繰り返し挿入します。したがって、以前にantakが提案したものと同様のものを使用して、ビジュアルブロックを1つのストリームとして作成する必要がありますが、ブロック用です(ファイル全体ではありません)。

  1. Bruce Edigerが述べたように、exの機能を追加します aで始まる . (ドット)を試すことはできますが、私の新しいテキスト(コード)にはドットで始まる行が含まれています。これは、追加構文のドットと見なすことができます。この状況でどのように使用できますか?

  2. exdd 「行数」は複数の行を削除する可能性がありますが、/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

非標準の拡張機能として。

改行文字とバックスラッシュ文字は、置換テキストで(バックスラッシュを使用して)エスケープする必要があります。


Linux
  1. ファイル内の文字列を置き換える方法は?

  2. Sedを使用して複数行の文字列を置き換える方法は?

  3. 文字列をSedのスラッシュを含む文字列に置き換える方法は?

  1. Sedは改行文字を置き換えることができますか?

  2. Linux 上の Python で export を使用する方法

  3. 柔軟なキーと値を使用して、sed を使用して構成ファイルを変更するにはどうすればよいですか?

  1. sed を使用して構成ファイルの変数を置き換える方法は?

  2. CSSで記述されたフォントを持つテキスト要素をキャンバスで使用する方法

  3. 複数行の Sed 置換