Заменить последний буквенно-цифровой символ случайным образом того же типа

Я нашел решение своей проблемы:

Диск и раздел, на котором была установлена ​​моя Arch Linux, были переименованы с nvme0 **на nvme1 **после установки дополнительного диска nvme на мой компьютер. Я исправил свою проблему, просто напрямую отредактировав файл fstab, расположенный в /etc, с помощью nano и вручную изменив 0 --> 1, чтобы последовательность загрузки действительно искала правильное расположение для моих разделов root, /home и SWAP.

Надеюсь, это поможет кому-нибудь, кто когда-нибудь столкнется с этой странной проблемой!

1
06.05.2019, 15:35
3 ответа

Попробуйте:

awk '
  BEGIN{
    srand()
    letter = "abcdefghijklmnopqrstuvwxyz"
    digit  = "0123456789"
  }
  function find_in(set) {
    if (index(set, c)) {
      c = substr(set, int(rand() * length(set) + 1), 1)
      return 1
    }
  }
  $0 != "" {
    c = substr($0, length)
    if (find_in(letter) || find_in(digit)) sub(/.$/, c)
  }
  {print}'

Обратите внимание, что в большинстве awkреализаций, если вы запустите эти команды дважды в одну и ту же секунду, вы получите тот же результат, что и начальное число для генератора псевдо-случайных чисел, основанное на текущем времени в секундах.

Символ замены является случайным, что означает, что он может совпадать с исходным. Если вы хотите исключить оригинал из списка возможных замен, вы можете изменить функцию find_inна :

.
  function find_in(set,   n) {
    if (n = index(set, c)) {
      set = substr(set, 1, n - 1) substr(set, n + 1)
      c = substr(set, int(rand() * length(set) + 1), 1)
      return 1
    }
  }
3
27.01.2020, 23:22

Использование модуля perl String ::Random :

perl -MString::Random -pe '
  BEGIN{$s = String::Random->new} 
  s{[a-z0-9]$}{$s->randpattern($& =~ /\d/ ? "n" : "c")}e
' file

Обратите внимание, что это не исключает того, что замещающий символ совпадает с исходным.Возможно, неэффективный и некрасивый способ исправить это может заключаться в том, чтобы просто «бросить кубик», пока не будет сгенерирован другой персонаж :

.
perl -MString::Random -pe '
  BEGIN{$s = String::Random->new} 
  s{[a-z0-9]$}{do {$c = $s->randpattern($& =~ /\d/ ? "n" : "c")} until $c ne $&; $c}e
' file
0
27.01.2020, 23:22
  1. Чистый bashметод:

    printf -v s '%s' {a..z} {A..Z} {0..9}
    while read x; do  
        n=${x:((-1))}
        echo -n ${x%?} 
        p=${s#*$n}
        echo ${s:(( (${#p}>=10) ? RANDOM*52/32768 : 52 + RANDOM*10/32768 )):1}
    done < file
    
  2. Метод GNUsedс использованием командыevalue для запуска trи headв /dev/urandom для генерации случайных символов:

    sed 's/\(.*\)\(.\)$/\
           printf \1 ; \
           echo \2 | \
           tr '[:alpha:][:digit:]' "$({ tr -dc '[:alpha:]' | head -c 52; \
                                        tr -dc '[:digit:]' | head -c 10; \
                                       } < \/dev\/urandom;)"/e'  file
    

Выход (меняется в зависимости от запуска):

bob1237
pittsburgq
0091916

Примечание. :ни один из методов не проверяет, отличается ли случайно выбранный символ от предыдущего символа, но чаще всего это так.

0
27.01.2020, 23:22

Теги

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