sedで文字列を横にn文字ずらしていく(スライドしていく)
Pocket

先日、シーザー暗号についての@ebanさんの解法でそういうのがあったので、後からの見返し用に記述しておく。
(GNU sedでしか見てないので注意。)

sedで、行を横にn文字ずらしていき、元あった文字は行頭に戻る(ループする)ような処理をする場合、以下のようにする。

sed -E 's/^(.{n})(.*)/\2\1/'
[root@BS-PUB-CENT7-01 ~]# sed -E 's/^(.{3})(.*)/\2\1/' <(printf %s {a..z})
defghijklmnopqrstuvwxyzabc

 

以下、シーザー暗号のとこでも書いてるけど、整理した内容。

[test@BS-PUB-CENT7-01 ~]$ # printfでa~zまでを出力させる。
[test@BS-PUB-CENT7-01 ~]$ # ※echoでブレース展開すると間に空白が入るので、printfで出している(ここでは最後に改行が入るためのechoしている)。
[test@BS-PUB-CENT7-01 ~]$ echo $(printf %s {a..z})
abcdefghijklmnopqrstuvwxyz
[test@BS-PUB-CENT7-01 ~]$
[test@BS-PUB-CENT7-01 ~]$ # sedでアルファベットの位置を入れ替えている。「^(.{3})」で、行頭から数えて○文字(とりあえず3文字にしている)を指定している。
[test@BS-PUB-CENT7-01 ~]$ # このとき、拡張正規表現で()内でグループ指定しているものは、\1、\2で指定できるので、それの位置を入れ替えてやる。
[test@BS-PUB-CENT7-01 ~]$ echo $(printf %s {a..z}) | sed -E 's/^(.{3})(.*)/\2\1/'
defghijklmnopqrstuvwxyzabc
[test@BS-PUB-CENT7-01 ~]$ echo $(printf %s {a..z}) | sed -E 's/^(.{3})(.*)/\2/'
defghijklmnopqrstuvwxyz
[test@BS-PUB-CENT7-01 ~]$ echo $(printf %s {a..z}) | sed -E 's/^(.{3})(.*)/\1/'
abc
Sponsored Links

スペース区切りの単語をスライドする場合

ちなみに、スペースで区切られている単語の場合(普通にechoされてる場合)だとどうなるのだろう?
上を参考に、以下のようにすればスペース区切りのものならスライドさせることができた。

echo a bb ccc dddd eeeee ffffff | sed -E 's/^((\S*\s){2})(.*)/\3 \1/'
echo a bb ccc dddd eeeee ffffff | perl -pe 's/^((\S*\s){3})(.*)/\3 \1/'
[root@BS-PUB-CENT7-01 ~]# echo a bb ccc dddd eeeee ffffff | sed -E 's/^((\S*\s){2})(.*)/\3 \1/'
ccc dddd eeeee ffffff a bb
[root@BS-PUB-CENT7-01 ~]# echo a bb ccc dddd eeeee ffffff | perl -pe 's/^((\S*\s){3})(.*)/\3 \1/'
dddd eeeee ffffff a bb ccc

 

sed使わない場合

sedを使わない場合だと(あるのかそんなこと)どうするのか。
とりあえず、以下のようにshufで2回出力させて、それをcutで抜き出して対応してみた。

w=5;printf %s {a..z} | shuf -rz -n 2 | cut -c $w-$(( $w + 26 ))
[root@BS-PUB-CENT7-01 ~]# w=2;printf %s {a..z} | shuf -rz -n 2 | cut -c $w-$(( $w + 26 ))
bcdefghijklmnopqrstuvwxyza
[root@BS-PUB-CENT7-01 ~]# w=6;printf %s {a..z} | shuf -rz -n 2 | cut -c $w-$(( $w + 26 ))
fghijklmnopqrstuvwxyzabcde
[root@BS-PUB-CENT7-01 ~]# w=9;printf %s {a..z} | shuf -rz -n 2 | cut -c $w-$(( $w + 26 ))
ijklmnopqrstuvwxyzabcdefgh

 

…うん、やっぱsed使ったほうがいいや。
数え方もsedと違うし。

Pocket

Written by blacknon

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

Leave a Comment

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