如何使用sed / awk用相同的字符串和随机数替换字符串和数字?

时间:2013-10-25 14:13:08

标签: regex string bash sed awk

我有一个文本文件,除了其他数据之外,还有多次出现的字符串,其中附加了一个随机数(在0-n之间)。例如:

string1
string33
string10

等等。

我希望能够替换每个具有相同字符串但附加了随机数(介于0-n之间)的字符串。例如:

string2
string9
string12

我尝试过这个nawk脚本,但我只能用它来替换文件中的所有数字。

nawk 'BEGIN{OFS=FS="";srand()}{for(i=1;i<=NF;i++)sub(/[0-9]/,("string")int(10*rand()),$i)}1' infile > outfile

另外,它取代了每个数字,因此一个两位数的数字可能最终为三个或四个。例如:

stringstring4
stringstring30
stringstring3string6

任何人都可以帮助我获得所需的输出吗?

1 个答案:

答案 0 :(得分:5)

你快到了那里:

$ nawk 'BEGIN{OFS=FS="";srand()}{for(i=1;i<=NF;i++)sub(/[0-9]/,int(10*rand()),$i)}1' infile
string5
string89
string57

$ nawk 'BEGIN{OFS=FS="";srand()}{for(i=1;i<=NF;i++)sub(/[0-9]/,int(10*rand()),$i)}1' file
string6
string08
string37

注意我刚刚更换了这个:

sub(/[0-9]/,("string")int(10*rand()),$i)
            ^^^^^^^^^^

使用:

sub(/[0-9]/,int(10*rand()),$i)

更新

  

我想我的问题并不清楚。我希望它只能替换   “string + number”的实例不是文件中的所有数字   文件中的其他数据

保持简单,无需设置FS:

awk '{for(i=1;i<=NF;i++) sub(/string[0-9]*/,"string"int(10*rand()),$i)}1' file

查找"string"加上许多[0-9],然后替换为"string"random

测试

$ cat a
string1
string33
string10
hello2
$ awk '{for(i=1;i<=NF;i++) sub(/string[0-9]*/,"string"int(10*rand()),$i)}1' a
string1
string7
string4
hello2
$ awk '{for(i=1;i<=NF;i++) sub(/string[0-9]*/,"string"int(10*rand()),$i)}1' a
string9
string3
string5
hello2