在sed中用一个变量替换另一个变量

时间:2019-12-24 21:46:23

标签: bash sed

我试图用sed -i交互地用另一个变量替换一个变量。这似乎很容易,但是由于某些原因无法正常工作。

假设我有一个包含1列的文件:

1
2
3
4
5
6
7
8
.
.

我想将这些值分配给一个变量,并对它们进行算术运算,这将是新变量,然后用新变量替换先前的变量。类似于以下内容:

for i in `awk '{print $1}' file.dat`;
do
        j=`echo $i | awk '{print ($1)*0.66}'`;
        sed -i "s/$i/$j/g" file.dat;
done

我希望得到以下信息:

0.66
1.32
1.98
2.64
3.3
3.96
4.62
5.28

但是,这就是我得到的:

0.3.963.96
1.1.95.282
1.95.28
2.3.964
3.3
3.96
4.62
5.28

我知道这可能很简单。但是,今天我的大脑不起作用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

$i1时,文件的第一行更改为0.66

然后,当$i6时,它将用6替换每个3.96字符,因此该行变为0.3.963.96

您需要更改正则表达式,使其仅匹配整行:

sed -i "s/^$i\$/$j/g" file.dat;

^$匹配行的开头和结尾。

虽然似乎没有太多理由使用sed,但是您可以完全使用awk来做到这一点:

awk '{print $1 * 0.66}' file.dat > newfile.dat

如果您使用的是GNU awk,则其扩展名可用于就地修改文件。

gawk -i inplace '{print $1 * 0.66}' file.dat