今私のテキストは次のようになります
"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