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)
由于在 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)