以前に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
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}}