在 Bash 的目录中,每个文件中的每一行用一个随机数替换一个字符串

Sim*_*ney 3 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
Run Code Online (Sandbox Code Playgroud)

这是我的脚本。每次找到它时,我都试图用不同的随机数替换 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
Run Code Online (Sandbox Code Playgroud)

JNe*_*ill 6

由于在 sed 中执行此操作会变得非常糟糕并且很快您可能想要切换到 awk 来执行此操作:

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

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

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

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