sed替换为eval

时间:2015-06-15 08:15:27

标签: 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作为字符串

2 个答案:

答案 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