sedでn個目〜n個目にヒットした箇所の置換を行う

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-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

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

This article has 1 comments

  1. Pingback: sedで偶数回目やn回目ごとにヒットした箇所を置換する | 俺的備忘録 〜なんかいろいろ〜

Leave a Comment

メールアドレスが公開されることはありません。

*