Bash sed替换为eval
我想做什么Bash sed替换为eval,bash,sed,Bash,Sed,我想做什么 replace: '1000' with: (a random number) shuf -i 500-1500 -n 1 shuf..每次出现1000 我试过的 sed -i 's/1000/$(shuf -i 500-1500 -n 1)/g' 但我只是将eval作为字符串,这是因为单引号逃避了$的含义,并且没有发生命令替换 解决方案是使用双引号 sed -i "s/1000/$(shuf -i 500-1500 -n 1)/g" 双引号保留了$和所有其他特殊字符的特殊含
replace: '1000'
with: (a random number) shuf -i 500-1500 -n 1
shuf..
每次出现1000
我试过的
sed -i 's/1000/$(shuf -i 500-1500 -n 1)/g'
但我只是将eval作为字符串,这是因为单引号逃避了
$
的含义,并且没有发生命令替换
解决方案是使用双引号
sed -i "s/1000/$(shuf -i 500-1500 -n 1)/g"
- 双引号保留了
和所有其他特殊字符的特殊含义$
要使用
shuf
中的不同值替换每个匹配项,可以使用basicwhile
循环文件,并将字符串替换为
while read line
do
echo "$line" | sed -i "s/1000/$(shuf -i 500-1500 -n 1)/g" >> output_temp
done
mv output_temp original_file
循环读取文件中的每一行并替换它们while
将原始文件替换为临时文件mv
awk
命令用shuf
输出中的新随机数替换1000
:
awk -v cmd="shuf -i 500-1500 -n 1" '{
while(index($0, "1000")) {
cmd | getline rnum;
close(cmd);
sub("1000", rnum, $0)
}
} 1' file
更新:使用
gnu awk
中的rand()
函数更新的更快版本:
awk '{while(sub("1000", int(10000 * rand()), $0));} 1' file
它将用相同的随机数替换每1000个,而不是每次都是一个新的随机数。@anubhava我似乎只解决了这一部分,但我只是将eval作为字符串。我将更新我的答案,然后更新以替换每次出现的新随机数。如果在整个循环中移动
>输出\u temp
重定向,而不是为每行写入,则速度会更快。i、 e.读取行时;do echo“$line”| sed-i“s/1000/$(shuf-i 500-1500-n1)/g”;完成>>输出临时文件和mv输出临时原始文件
我用更快的gnu awkawk'{while(sub(“1000”,int(10000*rand(),$0))x}1
更新了答案,因为少了一个函数调用