我想做什么
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作为字符串
答案 0 :(得分:5)
之所以发生这种情况,是因为单引号忽略了$
的含义,并且没有发生命令替换。
解决方案是使用双引号
sed -i "s/1000/$(shuf -i 500-1500 -n 1)/g"
双引号保留$
和所有其他特殊字符的特殊含义。
要使用shuf
中的不同值替换每个匹配项,可以使用基本while
遍历文件并将字符串替换为
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
将原始文件替换为临时文件。答案 1 :(得分:0)
您可以使用此awk
命令将1000
替换为shuf
输出中的新随机数:
awk -v cmd="shuf -i 500-1500 -n 1" '{
while(index($0, "1000")) {
cmd | getline rnum;
close(cmd);
sub("1000", rnum, $0)
}
} 1' file
更新:rand()
中使用gnu-awk
功能的更快版本:
awk '{while(sub("1000", int(10000 * rand()), $0));} 1' file