用Bash中每个文件的每一行替换一个带随机数的字符串

时间:2017-09-08 19:26:14

标签: bash shell awk sed

!/bin/bash

for file in ~/tdg/*.TXT
  do
    while read p; do
      randvalue=`shuf -i 1-99999 -n 1`
      sed -i -e "s/55555/${randvalue}/" $file
    done < $file
  done

这是我的剧本。我每次找到它时都试图用不同的随机数替换55555。这当前有效,但它用相同的随机数替换55555的每个实例。我试图用$ p替换sed命令末尾的$ file,但这只会爆炸。

实际上,即使我达到了要点,同一行上的每个实例都是相同的随机数,但每行使用一个新的随机数,那么我会很高兴。

修改

我应该指定这个。我想在文件中保存替换结果,而不是仅将结果打印到控制台。

修改

在JNevill的精彩帮助下,我的剧本的最终工作版本:

!/bin/bash

for file in ~/tdg/*.TXT
do
  while read p; 
  do
    gawk '{$0=gensub(/55555/, int(rand()*99999), "g", $0)}1' $file > ${file}.new
  done < $file
  mv -f ${file}.new $file
done

3 个答案:

答案 0 :(得分:2)

由于这样做是在sed获取pretty awful and quickly,您可能需要切换到awk来执行此操作:

awk '{$0=gensub(/55555/, int(rand()*99999), "g", $0)}1' $file

使用此方法,您可以删除内部循环,因为它会像awk一样逐行遍历整个文件。

你可以换掉整个脚本并直接将通配符文件名提供给awk:

awk '{$0=gensub(/55555/, int(rand()*99999), "g", $0)}1' ~/tdg/*.TXT

答案 1 :(得分:1)

JNevill解决方案的变体,每次运行脚本时都会生成一组不同的随机数...

示例数据文件:

$ cat grand.dat
abc def 55555
xyz-55555-55555-__+
123-55555-55555-456
987-55555-55555-.2.
.+.-55555-55555-==*

脚本:

$ cat grand.awk
{ $0=gensub(/55555/,int(rand()*seed),"g",$0); print }
  • gensub(...):与Nevill的回答相同,而我们会使用我们的种子价值混合rand()乘数[你可以在这里抛出任何数字你希望帮助确定结果值的大小]
  • **请记住,这会在同一行中使用相同的随机值替换55555的所有出现次数

脚本在行动:

$ awk -f grand.awk seed=${RANDOM} grand.dat
abc def 6939
xyz-8494-8494-__+
123-24685-24685-456
987-4442-4442-.2.
.+.-17088-17088-==*

$ awk -f grand.awk seed=${RANDOM} grand.dat
abc def 4134
xyz-5060-5060-__+
123-14706-14706-456
987-2646-2646-.2.
.+.-10180-10180-==*

$ awk -f grand.awk seed=${RANDOM} grand.dat
abc def 4287
xyz-5248-5248-__+
123-15251-15251-456
987-2744-2744-.2.
.+.-10558-10558-==*
  • seed=$RANDOM:让操作系统为我们生成一个随机int并作为awk变量
  • 传入seed脚本

答案 2 :(得分:0)

这是如何真正做你想用GNU awk做的事情:

awk -i inplace '{ while(sub(/55555/,int(rand()*99999)+1)); print }' ~/tdg/*.TXT

不需要shell循环或临时文件,它将在所有文件中和所有文件中使用不同的随机数替换每个55555。

其他问题就是:

seed="$RANDOM"
for file in ~/tdg/*.TXT; do
    seed=$(awk -v seed="$seed" '
            BEGIN { srand(seed) }
            { while(sub(/55555/,int(rand()*99999)+1)); print > "tmp" }
            END { print int(rand()*99999)+1 }
        ' "$file") &&
    mv tmp "$file"
done