이제 내 텍스트는 다음과 같습니다
"xyz1"
zyx1
"http://xyz1"
zyx1
"xyz1"
zyx1
출력이 다음과 같이 보이도록 1
범위 내의 임의의 숫자로 바꿔야합니다 .1-5
"xyz3"
zyx2
"http://xyz1"
zyx5
"xyz4"
zyx1
zyx
또는 xyz
1-5로 바꾸려면 1 앞에 나타나야 합니다.
답변1
그리고 perl
:
perl -pe 's/(zyx|xyz)\K1/1+int rand 5/ge' < file
답변2
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