(O+P)ut

OutPut Log by SE in SIer



(O+P)ut

Output Log by SE

【Linux】数字を文字列としてひとつ進めるワンライナー

スポンサーリンク

はじめに

数字を一つ進めるとは、「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

終わりに

シーザー暗号の数字バージョンですがパスワードを変更する際に一文字だけずらすといった暫定対応を取りたい場合に重宝するワンライナーです。同様の考え方は英字でも利用できるので、試してみてください。

以上、ご参考に慣れば幸いです。


他の記事を読む