Использование sed для замены "A" на "B" или "C"

Единственный раз, когда у меня возникла подобная проблема с rsync, я отследил ее до свободного порта Ethernet на другой машине, у которой был тот же IP-адрес, что и у моего целевого сервера. Если rsync работает нестабильно, это почти наверняка проблема с надежностью сети или (, в моем случае ), проблема с конфигурацией.

4
21.06.2019, 01:29
2 ответа

Не 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
5
27.01.2020, 20:46

Можно заменить первое совпадение строки на:

${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)")
7
27.01.2020, 20:46

Теги

Похожие вопросы