bash / sedで値を計算に置き換える方法

bash / sedで値を計算に置き換える方法

私はbash sedを使用してファイルセット(例:10.1.1.x => 10.2.2.x-19)のIPアドレスを置き換えます。

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, 

など。

私はほとんどそれをしました:

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

ただし、最後のアドレス位置(x => x-19)を計算して置き換える方法はわかりません。

本当に簡単かもしれません...

答え1

これを行うには、sedの代わりにawkを使用することをお勧めします。

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

1つの方法は次のとおりです。

$ 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。既存の4番目のオクテットをsed追加および削除して元のコンテンツを拡張する必要があります。[0-9]\+$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

関連情報