sedで行のレンジを複数指定(2,4と6,8など)して置換処理をさせる

Twitterをボケーッと眺めてたところ、そんな感じの処理についてを見かけたので、処理方法についてを残しておく。
sedでは、以下のように指定することで指定行の範囲(以下の例では、n~m行目)でのみ処理を行わせる事が可能となっている。

sed 'n,m s/$/*/g'
blacknon@BS-PUB-UBUNTU-01:~$ seq 10 | sed '2,4 s/$/*/g'
1
2*
3*
4*
5
6
7
8
9
10
Sponsored Links

で、今回はこの範囲指定を複数(例えば2,4と6,8)指定して、同じ処理を行わせようという内容。
個人的には、こういった場合はブレース展開を利用する方法を好むので、今回もそのようにする。値にカンマを含むため、指定する際にエスケープさせる必要があるのでそこは注意が必要。

sed -e{"2,4","6,8"}'s/$/*/g'
blacknon@BS-PUB-UBUNTU-01:~$ seq 10 | sed -e{"2,4","6,8"}'s/$/*/g'
1
2*
3*
4*
5
6*
7*
8*
9
10
blacknon@BS-PUB-UBUNTU-01:~$ 
blacknon@BS-PUB-UBUNTU-01:~$ # 以下のように展開されて実行されている
blacknon@BS-PUB-UBUNTU-01:~$ echo sed -e{"2,4","6,8"}'s/$/*/g'
sed -e2,4s/$/*/g -e6,8s/$/*/g

 

見た目としてはあまりキレイではないけど、書き捨てのコードならこんなものでもいいのではないだろうか。
ちなみに、perlだと以下のようにifで指定できるので、あとから見た時にもうちょっとわかりやすい気がする。

seq 10 | perl -pne 's/$/*/ if 2..4 or 6..8'
blacknon@BS-PUB-UBUNTU-01:~$ seq 10 | perl -pne 's/$/*/ if 2..4 or 6..8'
1
2*
3*
4*
5
6*
7*
8*
9
10

 


Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

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

*