sed 範囲境界そのものは含まない範囲指定

202年03月16日 2024年11月4日 加筆

sedの範囲指定は X <= hoge <= Y となっている。 これを X < hoge < Y にするにはひと工夫必要になる。

たとえば、 指定範囲の処理をしようと思うと、 以下のようにするだろう。 これは指定範囲内の '<' を '&lt;' に、 '>' を '&gt;' に置換する。

1/<pre>/,/<\/pre>/ {
2     s/</\&lt;/
3     s/>/\&gt;/
4}

これは指定通りに動くが、おそらくあなたの意図とは異なる。 sedのアドレス範囲は、上記で言う <pre> の行も </pre> の行も 含むので、 '&lt;pre&lgt;' と '&lt;/pre&gt;' も拝むハメになる。

そこで範囲の境界そのものは含まないよう、 以下のようにしてみた。

 1/<pre>/,/<\/pre>/ {
 2     /<pre>/ {
 3             n
 4     }
 5     /<\/pre>/ {
 6             n
 7             q
 8     }
 9     s/</\&lt;/
10     s/>/\&gt;/
11}

指定範囲の中で、 <pre> だったら、 その行を出力して次のサイクルに映る (nコマンドは print;continue 動作する)。 指定範囲の中で、 </pre> だったら、 その行を出力して、その後 サイクルを中断する(指定範囲の処理から抜ける break )。 指定範囲の中で、 それ以外は s する。