Единственный раз, когда у меня возникла подобная проблема с rsync, я отследил ее до свободного порта Ethernet на другой машине, у которой был тот же IP-адрес, что и у моего целевого сервера. Если rsync работает нестабильно, это почти наверняка проблема с надежностью сети или (, в моем случае ), проблема с конфигурацией.
Не Sed, но избегает Perl:
$ echo AAXXAAYYBB | gawk '
BEGIN{srand()}
{
n = patsplit($0,a,/A/,s);
for(i=1;i<=n;i++) printf("%s%s", rand() < 0.5 ? "B" : "C", s[i]);
print ""
}
'
CBXXCCYYBB
Можно заменить первое совпадение строки на:
${str/A/...}
Кроме того, можно сгенерировать случайное (не криптографически безопасное числовое значение )с помощью:
r=(B C)
${r[RANDOM%2]}
Каждый раз расширяется переменная r
.
Точно эквивалентной операцией, но намного более быстрой в реализации, является И для извлечения последнего бита значения:${r[RANDOM&1]}
Так:
#!/bin/bash
str=AAXXAAYYBB
r=(B C)
while [ "${str%"${str#*A}"}" ]; do # while there is an A to change
str=${str/A/"${r[RANDOM&1]}"}
done
echo "str=$str"
Будет генерировать случайный результат при каждом вызове.
Возможно
#!/bin/sh
str=AAXXAAYYZZAAA
while [ "${str%"${str#*A}"}" ]; do # while there is an A.
r=$(od -An -tu1 -N 1 /dev/urandom) # get one random byte
r=$((r&1)) # Is it even or odd?
if [ "$r" -eq 0 ]; then s=B; else s=C;fi # Select B or C
str="${str%%A*}${s}${str#*A}" # Change the string.
done
echo "str=$str"
Возможно, случайный байт можно было бы прочитать с помощью более простого (, но более загадочного ), который в большинстве случаев использует более быстрый встроенный printf:
r=$(printf '%d\n' "'$(head -c1 /dev/urandom)")