テキストの数字を範囲内の任意の数字に置き換えます。

テキストの数字を範囲内の任意の数字に置き換えます。

今私のテキストは次のようになります

"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

関連情報