はじめに
数字を一つ進めるとは、「314」を「315」にするのではなく「425」にすることを意味しています。
本記事では、それらを実現するワンライナーと解説を行います。
環境情報
$ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
数字を一つ進めるワンライナー
結論から言えば
tr "$(printf %1s0-9)" 0-90-9
で行います。
$ echo 0123456789 | tr "$(printf %1s0-9)" 0-90-9 1234567890
冒頭の「314」であればとなります。
$ echo 314 | tr "$(printf %1s0-9)" 0-90-9 425
以下、補足です。
補足
trコマンドにて置換しています。一つ目の引数を二つ目の引数に置換するので例えば以下であれば
$ echo 314 | tr 1 5 354
1が5に変更されています。
あとは引数を一つずらした数字と元の数字という置換ルールにします
$ echo 314 | tr "$(printf %1s0-9)" 0-9 425
ずらす数を変えたければ2s、3sと変更できます。
$ echo 314 | tr "$(printf %2s0-9)" 0-9 536 $ echo 314 | tr "$(printf %3s0-9)" 0-9 647
ただしこの記法は注意が必要で大きくずらすと数字が9で止まってしまいます。
$ echo 314 | tr "$(printf %7s0-9)" 0-9 989
これはずらす数が1であったとしても「9」が入れば「9」のままであることを意味します。
$ echo 3149 | tr "$(printf %1s0-9)" 0-9 4259
よって二周目をまた0から始めるよう「0-9」を追加して以下とします。
$ echo 3149 | tr "$(printf %1s0-9)" 0-90-9 4250
これが冒頭に記載したワンライナーとなります。
ただ、これも同じでずらし方によっては3周目の追加も必要です。
$ echo 3149 | tr "$(printf %9s0-9)" 0-90-9 2038 $ echo 3149 | tr "$(printf %10s0-9)" 0-90-9 3149 $ echo 3149 | tr "$(printf %11s0-9)" 0-90-9 4259 $ echo 3149 | tr "$(printf %11s0-9)" 0-90-90-9 4250
終わりに
シーザー暗号の数字バージョンですがパスワードを変更する際に一文字だけずらすといった暫定対応を取りたい場合に重宝するワンライナーです。同様の考え方は英字でも利用できるので、試してみてください。
以上、ご参考に慣れば幸いです。