この sed ヒント ページの「マーカー 1 とマーカー 2 の間の削除」セクションをご覧ください。
あなたの例にそれを適用します。clean.sed :
/^\[aaa bbb\]$/,/^\[ccc ddd\]$/{
/^\[aaa bbb\]$/!{
/^\[ccc ddd\]$/!d
}
}
次を使用して実行します。
sed -f clean.sed inputfile.txt
入力ファイルを「その場で」編集するには、-i オプションを使用して sed を実行します。
sed -i.bak -f clean.sed datafile.txt
元のファイルを編集する前に、「datafile.txt.bak」という名前のファイルのバックアップ コピーが保存されます。
編集:マーカーが常に独自の行にあるという仮定が間違っていたため、行の途中でマーカーを処理できるスクリプトを次に示します。
/\[aaa bbb\]/,/\[ccc ddd\]/{
s/\[aaa bbb\].*/[aaa bbb]/
s/.*\[ccc ddd\]/[ccc ddd]/
/\[aaa bbb\]$/!{
/^\[ccc ddd\]/!d
}
}
この入力の場合:
foo[aaa bbb]1
2
3
4
5[ccc ddd]bar
foo
[aaa bbb]
1
2
3
[ccc ddd]
bar
以下を生成します。
foo[aaa bbb]
[ccc ddd]bar
foo
[aaa bbb]
[ccc ddd]
bar
ノート!マーカーが同じ行に表示されるファイルは処理できません。
再度編集:マーカー 1 の入力形式が、常にそれ自体の行にあると期待できるようなものである場合は、スクリプトをいくつか簡略化できます。
/^\[aaa bbb\]$/,/\[ccc ddd\]/{
s/.*\[ccc ddd\]/[ccc ddd]/
/^\[aaa bbb\]$/!{
/^\[ccc ddd\]/!d
}
}
(行頭と行末にマーカー 1 を固定し、マーカー 1 行のトリミングをスキップします。)