sed 範囲境界そのものは含まない範囲指定¶
202年03月16日 2024年11月4日 加筆
sedの範囲指定は X <= hoge <= Y となっている。 これを X < hoge < Y にするにはひと工夫必要になる。
たとえば、 指定範囲の処理をしようと思うと、 以下のようにするだろう。 これは指定範囲内の '<' を '<' に、 '>' を '>' に置換する。
1/<pre>/,/<\/pre>/ {
2 s/</\</
3 s/>/\>/
4}
これは指定通りに動くが、おそらくあなたの意図とは異なる。 sedのアドレス範囲は、上記で言う <pre> の行も </pre> の行も 含むので、 '<pre&lgt;' と '</pre>' も拝むハメになる。
そこで範囲の境界そのものは含まないよう、 以下のようにしてみた。
1/<pre>/,/<\/pre>/ {
2 /<pre>/ {
3 n
4 }
5 /<\/pre>/ {
6 n
7 q
8 }
9 s/</\</
10 s/>/\>/
11}
指定範囲の中で、 <pre> だったら、 その行を出力して次のサイクルに映る (nコマンドは print;continue 動作する)。 指定範囲の中で、 </pre> だったら、 その行を出力して、その後 サイクルを中断する(指定範囲の処理から抜ける break )。 指定範囲の中で、 それ以外は s する。