sedで偶数回目やn回目ごとにヒットした箇所を置換する

以前にsedでn個目~n個目までにヒットした箇所のみを置換する処理について記述したが、今回は奇数・偶数回目にヒットした箇所、n回目ごとにヒットした箇所のみを置換する処理についてを備忘として残しておくことにする。
基本は同じで、ブレース展開を使って置換処理についての箇所を生成させるというもの。以下、実行例。

sed -e's/before/after/'{1,{2..1000..1}} # 奇数ごとの場合
sed -e's/before/after/'{2,{3..1000..1}} # 偶数ごとの場合
sed -e's/before/after/'{n,{(n*2-1)..1000..(n-1)}} # n個ごとの場合
blacknon@BS-PUB-DEVELOP:~$ echo {A..Z} | sed -e's/ /-/'{1,{2..1000..1}} # 奇数ごとの置換
A-B C-D E-F G-H I-J K-L M-N O-P Q-R S-T U-V W-X Y-Z
blacknon@BS-PUB-DEVELOP:~$ echo {A..Z} | sed -e's/ /-/'{2,{3..1000..1}} # 偶数ごとの置換
A B-C D-E F-G H-I J-K L-M N-O P-Q R-S T-U V-W X-Y Z
Sponsored Links

n個ごとに置換する処理については、実行例とセットのほうがわかりやすいだろう。
例えば、3個ごと、4個ごとにヒットした箇所を置換する場合だと以下のようにする。

blacknon@BS-PUB-DEVELOP:~$ echo {A..Z} | sed -e's/ /\n/'{3,{5..1000..2}} # 3回目のヒットごとに置換
A B C
D E F
G H I
J K L
M N O
P Q R
S T U
V W X
Y Z
blacknon@BS-PUB-DEVELOP:~$ echo {A..Z} | sed -e's/ /\n/'{5,{9..1000..4}} # 5回目のヒットごとに置換
A B C D E
F G H I J
K L M N O
P Q R S T
U V W X Y
Z

 

その他の実例として、たとえば3行ごとの内容をnull文字区切りで1行にまとめる場合、以下のようにする。

seq -f"A%03g" 001 0120 | tr '\n' '\0' | sed -r -e's/\x0/\n/'{3,{5..1000..2}}

 


Written by blacknon

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

This article has 1 comments

  1. Pingback: Linux/UNIXでワンライナーで複数ファイルの行を交互に出力させる(1行ごと、n行ごと) | 俺的備忘録 〜なんかいろいろ〜

Leave a Comment

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

*