텍스트의 숫자를 범위 내의 임의의 숫자로 바꿉니다.

텍스트의 숫자를 범위 내의 임의의 숫자로 바꿉니다.

이제 내 텍스트는 다음과 같습니다

"xyz1"
zyx1
"http://xyz1"
zyx1
"xyz1"
zyx1

출력이 다음과 같이 보이도록 1범위 내의 임의의 숫자로 바꿔야합니다 .1-5

"xyz3"
zyx2
"http://xyz1"
zyx5
"xyz4"
zyx1

zyx또는 xyz1-5로 바꾸려면 1 앞에 나타나야 합니다.

답변1

그리고 perl:

perl -pe 's/(zyx|xyz)\K1/1+int rand 5/ge' < file

답변2

사용awk랜드() 그리고중상기능:

awk 'BEGIN{srand()}{print gensub(/(zyx|xyz)1/, "\\1"1 + int(rand() * 5), 1)}' file

zyx1각 줄에서 또는 의 첫 번째 항목만 바꿉니다 . xyz1네가 원한다면모두가능한 경우 교체하고 마지막 것을 (전역) 1으로 변경하십시오."g"

노트:스크립트가 동일한 초 내에 여러 번 실행되면 동일한 결과가 생성될 수 있습니다.

"srand()"처럼 x 매개변수를 생략하면 현재 날짜와 시간이 시드로 사용됩니다. 이것은 정말 예측할 수 없는 난수를 얻는 방법입니다.

이 작업을 원하지 않으면 무작위 시드를 현재 시간의 나노초 부분과 같이 원하는 값으로 변경할 수 있습니다(지원하는 경우 date).

seed=$(date '+%N')
awk -v s="$seed" 'BEGIN{srand(s)}{print gensub(/(zyx|xyz)1/, "\\1"1 + int(rand() * 5), 1)}' file

답변3

GNU와 함께awk부르다shuf주문하다:

awk 'BEGIN{ cmd="shuf -i 1-5 -n1" }
     { cmd | getline num; close(cmd); sub("1", num) }1' file

산출:

"xyz3"
zyx4
"http://xyz2"
zyx5
"xyz1"
zyx2

관련 정보