ファイル内の大きなテキストブロック(シェルスクリプトコード)を別のテキストブロックに置き換える必要があります。
sedを使用して複数行の文字列を置き換えるにはどうすればよいですか? 回答済み antak および Multi-line replace 回答済み- ブルース・エディガー
しかし、私はそれらを使用する際にいくつかの問題を抱えています。
antak ファイル全体(1h;2,$H;$!d;g;
)をバッファにストリーミングすることは、メモリが過負荷になるため、大きなファイルには推奨されないという彼の回答ですでに言及されています。
sed
をブロック機能で使用して、ブロック外のテキストを変更せずに保持できることを知っています。この機能を使いたい。でも使ったら
sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
ストリームごとに新しいテキスト(コード)を繰り返し挿入します。したがって、ビジュアルブロックを1つのストリームとして作成する必要があります。以前に antak で提案されたものと似ていますが、ブロック用です(ファイル全体ではありません)。
Bruce Edigerex
で始まるa
で始まる追加機能.
(dot)で終わるように試すことができますが、新しいテキスト(コード)ドットで始まる行を含みます。これは、追加構文のドットと見なすことができます。この状況でどのように使用できますか?
ex
のdd
'行数'は複数の行を削除する可能性がありますが、/ marker1 /と/ marker2 /の間に固定されていない(変化する)行数のブロックがある場合は置き換えられます新しいテキスト(コード)で、どうやってそれを行うのですか?
c hangeコマンドを使用することをお勧めします(これは基本的にd eleteとa ppendを組み合わせたものですが、appendは最後にのみ適用されます)ここで正確に必要な範囲の行):
sed -i '/marker1/,/marker2/c\
New text 1\
New text 2' filename
ここではGNU sed
のインプレース編集用の構文(-i
)。そのc
コマンドは、それ以外の点では標準的で移植性があります。 GNU sed
は以下をサポートします:
sed '/marker1/,/marker2/cNew text 1\
New text 2' filename
非標準の拡張として。
置換テキストでは、改行文字とバックスラッシュ文字を(バックスラッシュで)エスケープする必要があります。
3
に一致する行から始まり、5
に一致する行に続く行をNew Code
で置き換えるには:
$ seq 8 | sed '/3/,/5/{/5/ s/.*/New Code/; t; d}'
1
2
New Code
6
7
8
/3/,/5/
の範囲の行については、その行が5
(これがグループの最後の行であることを意味する)と一致するかどうかをテストし、一致する場合は、置換を行ってNew Code
を挿入します。置換が行われた場合、t
コマンドは、sedにコマンドの最後にジャンプするよう指示します(この場合、New Code
が出力されます)。そうでない場合、d
コマンドはsedに行を削除するように指示します。
他のすべての行は通常どおり印刷されます。
ファイルを適切に変更するには、-i
オプションを使用できます。
sed -i.bak '/3/,/5/{/5/ s/.*/New Code/; t; d}' file
Awkを使用して同じことを行うには:
$ seq 8 | awk '/3/,/5/{if (!f)print "New Code"; f=1; next}; 1'
1
2
New Code
6
7
8
Awkコマンドは、/3/,/5/
の範囲の行を特別に扱います。その範囲の行について、f
がゼロかどうか(つまり、!f
がtrueかどうか)をテストし、ゼロの場合はNew Code
を出力してf
を1に設定してからスキップします残りのコマンドとnext
行にジャンプします。
/3/,/5/
の範囲外の行の場合、ジャンプは行われず、1
によって行が出力されます。より詳細には、1
は条件です。 1
はゼロではないため、条件はtrueと評価されます。条件に関連付けられているアクションがないため、行を印刷するというデフォルトのアクションが実行されます。したがって、1
は、印刷行の省略形です。
ファイルをその場で変更するには、-i inplace
オプションをGNU awk
4.1以上で使用できます。
awk -i inplace '/3/,/5/{if (!f)print "New Code"; f=1; next} 1' file
上記の議論に基づいて、私はex
を使用した解決策を考え出します
seq 15 > test1.txt
ex test1.txt << EOEX
/^7/,/^9/c
abcd
123
.xyz
hfr4
.
w!
q
EOEX
cat test1.txt
上記は与える
1
2
3
4
5
6
abcd
123
.xyz
hfr4
10
11
12
13
14
15
g-man に変更コマンドを認識させ、ドットについての説明をお願いします。 sed
とex
はどちらも、変更コマンド(削除コマンド、追加コマンドなど)とほぼ同じ構文を共有しています。