Вместо того, чтобы tr -dc
избавиться от непечатаемых -символов, я бы просто использовал base64
из coreutils:
$ base64 -w20 /dev/urandom | head -8
ckXkWvb0zJknz2zi4fRS
3Jv0dDbKiX8fef7SOfbH
QJySlGUzzhi32wvrGliK
YEiuz6v+EFaRYRMjvnJq
HCXIPiP9wmgONLRqm9uK
iHYwo5xIs8gGjQQEQBeX
8NkL4EkmOAHdmWhGvZYl
AcxD2DaTq2TZRsDL+UMx
Если проблемы с +
и /
, вы можете заменить их:
$ base64 -w20 /dev/urandom | tr +/ pq | head -8
zr7MgiEr7xBd7h9ihK30
IRNvDuT2H9HsHVq9yFqh
S1cihgfAInjfFspMNXVC
qUUwGErD7nZqtzQtLOo7
DNDp4TVWvHmbEh7HLDGX
GtqqDdEoceY8m5U7FGu0
TvGtTukm6Whr7VHN1mZG
DW5TUH525IA52zLKYACV
Сzsh
:
$ number=12345
$ printf '%s\n' ${(j[+])${(s[])number}}
1+2+3+4+5
s[]
флаг расширения параметра для разделения $number
на его символьные компоненты. j[+]
, чтобы присоединиться к ним с помощью +
.
Сbash
:
$ number=12345
$ shopt -s extglob
$ tmp=${number//@()/+}
$ printf '%s\n' "${tmp#+}"
1+2+3+4+5
${number//@()/+}
заменяет все вхождения ничего на +
. По какой-то причине ${number///+}
не работает в bash
(, но работает в zsh
, хотя ).
просто некоторые другие возможности использования perl вместо awk или sed:
echo 12345 | perl -lpe '$_ = join "+", split //;'
или (, если номер сохранен вfl.txt
)
# echo 12345 > fl.txt
perl -lpe '$_ = join "+", split //;' fl.txt
параметр -l
просто позволяет избежать включения окончания строки (при объединении с помощью "+" ). в противном случае у вас было бы 1+2+3+4+5+
в качестве результата.
в качестве альтернативы вы можете использовать метод, подобный уже упомянутому для sed:
perl -pe 's/.\K/+/g; s/\+$//;' fl.txt
или
perl -pe 's/.\K(?!$)/+/g;' fl.txt
или
perl -pe 's/\B/+/g;' fl.txt
вывод во всех случаях:
1+2+3+4+5
Есть много способов сделать это. На пути к использованию Ruby, чтобы разбить вашу строку на символы, а затем соединить их вместе с символом +
. Например, в командной строке:
$ ruby -e 'puts ARGV.first.chars.join "+"' 12345
1+2+3+4+5