
IPSパラメータには差分IPアドレスが含まれています。
IPS="192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127"
IPアドレスの3番目の「。」数字を「、」に変更したい。
またはを通じてsed
これを達成する方法は何ですかawk
?
例:
echo $IPS | sed ……..
要求された出力
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
答え1
シェルから:
IPS='192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127'
echo $(IFS=\ .; printf %s.%s.%s,%s\ $IPS)
出力
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
しかし、より良い方法(実際に配列を使用できる方法)は、配列を関数に変換することです。
iprng() (IFS=.;for ip do printf %s.%s.%s,%s\\n $ip; done)
iprng $IPS
出力
192.9.200,12-14
172.17.200,12-89
12.21.1,10-25
127.0.0,1-127
または...
echo $(iprng $IPS)
出力
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
見てわかるように、単純でawk
他の実行可能ファイルを呼び出さずに実行されることを除いて、他の場所で行われた操作と本質的に同じです。
答え2
すべてを最後のポイントまで一致させ、グループとして覚えてください。
$ echo $IPS | sed 's/\([^ ]*\)\./\1,/g'
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127
答え3
IP アドレスのオクテットに一致する最初と 2 番目のグループをキャプチャし、範囲の前のドットの代わりにコンマ文字を使用してそのグループを返します。
echo ${IPS}|perl -pe 's!(\d{1,3}\.\d{1,3}\.\d{1,3})\.(\d+-\d+\s+)!$1,$2!g'
Perlでは、\d
「\ s」を使用して数字とスペースを表すことができます。
答え4
を使用すると、perl
次のことができます。
echo "${IPS}" | perl -pe 's/\./(++$c%3==0)?",":"."/ge'