sedでは、以下のようにn個目のキーワードのみを置換といった指定ができる。

※ nはn個目の箇所を数字で記述
sed 's/before/after/n'
blacknon@blacknon-ThinkPad-X201:~$ echo {A..Z} | tr ' ' 'x'
AxBxCxDxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZ
blacknon@blacknon-ThinkPad-X201:~$ 
blacknon@blacknon-ThinkPad-X201:~$ # 3個目を置換
blacknon@blacknon-ThinkPad-X201:~$ echo {A..Z} | tr ' ' 'x' | sed 's/x/-/3'
AxBxC<span style="color: #ff0000;">-</span>DxExFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZ

では、n個目〜n個目までを置換するといった指定をする場合、どうすればいいのかと思ったので、調べてみた。 なお、n個目〜最後まで、最後〜n個目まで以外を置換する場合、以下のように指定できる。

# n個目〜最後までを置換する場合
sed 's/before/after/ng'

# 最後からn個目まで以外を置換する場合
command | tac | rev | sed 's/before/after/ng' | tac | rev

blacknon@blacknon-ThinkPad-X201:~$ # 13個目〜最後までを置換
blacknon@blacknon-ThinkPad-X201:~$ echo {A..Z} | tr ' ' 'x' | sed 's/x/-/13g'
AxBxCxDxExFxGxHxIxJxKxLxM-N-O-P-Q-R-S-T-U-V-W-X-Y-Z
blacknon@blacknon-ThinkPad-X201:~$ 
blacknon@blacknon-ThinkPad-X201:~$ # 最後から3個めまで以外を置換
blacknon@blacknon-ThinkPad-X201:~$ echo {A..Z} | tr ' ' 'x' | tac | rev | sed 's/x/-/3g' | tac | rev
A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-XxYxZ

n個目〜n個目を指定する場合、残念ながらsedの機能だと単体では難しそうな様子。 なので、ブレース展開と組み合わせて処理をしてみた。 置換する数だけ「,」を増やすことで対処可能。

sed -e\ 's/before/after/n'{,,,}
blacknon@blacknon-ThinkPad-X201:~$ # 5個目から5個置換をする
blacknon@blacknon-ThinkPad-X201:~$ echo {A..Z} | tr ' ' 'x' | sed -e\ 's/x/-/5;'{,,,,,}
AxBxCxDxE-F-G-H-I-J-KxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZ