如何在 bash/sed 中用计算替换值

如何在 bash/sed 中用计算替换值

我使用bash sed替换一组文件中的ip地址,即10.1.1.x => 10.2.2.x-19:

file1: 10.1.1.29 => 10.2.2.10, 
file2: 10.1.1.30 => 10.2.2.11, 
file3: 10.1.1.31 => 10.2.2.12, 

ETC。

我几乎做到了:

for file in ifcfg* ; do sed -e "s/10.1.1./10.2.2./" $file >tmp/$file ; done

但无法弄清楚如何计算和替换最后一个地址位置(x => x-19)

这可能真的很容易...

答案1

使用 awk 而不是 sed 来完成此操作会更幸运。

awk -F. '{printf ("%d.%d.%d.%d\n",$1,$2,$3,$NF-19)}'

或者按照你的例子,

awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}'

或者

for file in ifcfg*
do
    awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}' $file >tmp/$file
done

要保留其他行并假设这x是要替换的行上的最后一个元素,请执行以下操作

for file in ifcfg*
do
    awk -F. '/10.1.1/ {printf ("%s.%d.%d.%d\n",$1,2,2,$NF-19)}
             !/10.1.1/ {print $0}' $file > tmp/$file
done

答案2

这是一种方法:

$ for file in ifcfg*; do
    num=$(grep IPADDR $file|awk -F. '{print $4}')
    sed -e "s/10.1.1.[0-9]\+/10.2.2.$(($num-19))/" $file >tmp/$file
  done

这将获取 IP 地址的内容并将其缩减为第 4 个八位字节,并将其存储在变量 中$num。然后在命令19期间添加该变量sed。我需要sed通过添加[0-9]\+删除现有的第 4 个八位字节来扩展您的原始内容,以便我们可以将其替换为$num+19.

答案3

awk 'BEGIN{FS=OFS="."} {$NF -= 19; print $0 > ("tmp/" FILENAME)}' ifcfg*

答案4

我会为此使用 perl :

$ grep '10\.' file[123]
file1:10.1.1.29
file2:10.1.1.30
file3:10.1.1.31

$ perl -i -pe 's/10\.1\.1\.(\d+)/ "10.2.2." . ($1 - 19) /ge' file[123]

$ grep '10\.' file[123]
file1:10.2.2.10
file2:10.2.2.11
file3:10.2.2.12

相关内容