Вы можете использовать perl
:
perl -pe 's/[\d+-]+/eval$&/ge' your-file
Или даже:
perl -pe 's/[\d+-]+/$&/gee' your-file (thanks Rakesh)
То же самое с zsh
:
set -o extendedglob # for the ## operator (same as ERE +)
while IFS= read -r line; do
printf '%s\n' ${line//(#m)[0-9+-]##/$((MATCH))}
done < your-file
Или:
zmodload zsh/mapfile
set -o extendedglob
printf %s ${mapfile[your-file]//(#m)[0-9+-]##/$((MATCH))}
Во всех в-четвертых, мы ищем последовательности цифр -
и +
символов и передаем их арифметическому процессору интерпретатора (eval
в perl
(или флаг ee
, который заставляет расширение замены оцениваться как код perl
), $((...))
в зш
).
Мы не проверяем выражения перед передачей интерпретатору, поэтому это может привести к сбоям (например, в таких последовательностях, как -+-
или 3++
), но по крайней мере , поскольку мы рассматриваем только цифры и -
/+
символы, это не должно причинить большего вреда, чем сообщение об ошибке и прерывание команды.
Это должно сработать:
for i in serverlist;do
ssh $i "usermod --password $(echo my_new_password | openssl passwd -1 -stdin) USERNAME"
done
usermod не запрашивает, но пароль должен быть сначала зашифрован.