Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed替换为eval_Bash_Sed - Fatal编程技术网

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
中的不同值替换每个匹配项,可以使用basic
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
    将原始文件替换为临时文件

您可以使用此
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 awk
awk'{while(sub(“1000”,int(10000*rand(),$0))x}1
更新了答案,因为少了一个函数调用