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

で、今回はこの範囲指定を複数(例えば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