마지막 영숫자 문자를 동일한 유형의 임의 문자로 바꾸십시오.

마지막 영숫자 문자를 동일한 유형의 임의 문자로 바꾸십시오.

파일에 간단한 영숫자 기계 이름 목록이 있고 마지막 문자나 숫자를 변경하고 싶지만 문자 유형과 일치하도록 하고 싶습니다. 따라서 마지막 문자가 숫자인 경우 임의의 숫자로 바꿔야 합니다. 마지막 문자는 문자이므로 임의의 문자로 바꿔야 합니다.

bob1234
pittsburgh
0091919

될 것입니다:

bob1239
pittsburgp
0091915

답변1

노력하다:

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
    }
  }

답변2

펄을 사용하여문자열::임의기준 치수:

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

답변3

  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. 암소 비슷한 일종의 영양 sed방법, 사용e평가명령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

참고: 두 방법 모두 무작위로 선택한 문자가 이전 문자와 다른지 여부를 확인하지 않지만 일반적으로 그렇습니다.

관련 정보