1

多くの ID アドレス (IPV4 と IPV6 の両方) を含むファイルがあります。sed コマンドを使用して、古い IP のすべてのオカレンスを新しい IP に置き換えたいと考えています。しかし、私は問題に直面しています:

以下のような古いIP

2.2.2.2             -IPV4      
2:2:2.2.2.2         - IPV6: Note ':'

kshでは、使用しています

oldIP=2.2.2.2
newIP=3.3.3.3

sed -i 's/'$oldIP'/'$newIP'/g' filename.

しかし、これは 2.2.2.2 と 2:2:2.2.2.2 の両方を置き換えています。in oldIP 変数は正規表現として使用されます。

scipt 内のファイルの正確な IP を一致させる方法を教えてもらえますか?

入力ファイル: a.txt - oldIP、newIP を含む

1.1.1.1,9.9.9.9
0.0.0.0,9.9.9.9
2.2.2.2,9.9.9.9
5:5:5.5.5.5,[9:9:9.9.9.9]
3.3.3.3,9.9.9.9
3:3:3.3.3.3,9:9:9.9.9.9
1:1:3.3.3.3,9:9:9.9.9.9

#!/bin/ksh

ipAddrFile=$1
while read line
do
    OLDIFS=$IFS
    IFS=","
    array=( $line )
    IFS=$OLDIFS

    if [ "${array[1]}" = "" ]; then
        echo "tokenize ip address list fail. Check if proper separator is used."
    fi

    oldIP=${array[0]}
    newIP=${array[1]}

    `sed -i 's/'$oldIP'/'$newIP'/g' temp.xml`
       if [ $? -ne 0 ]; then
       echo "Replacing field value failed"
      exit 1
   fi


done < $ipAddrFile
4

1 に答える 1

3

まず、正規表現でドットをエスケープする必要があります。そうしないと、任意の文字に一致します。したがって、変数を次のように設定します。

oldIP="2\.2\.2\.2"
newIP="3.3.3.3"

次に、この sed を使用できます。

sed -r "s/(^|[^:])$oldIP([^0-9]|$)/\1$newIP\2/g" input

または Mac の場合:

sed -E "s/(^|[^:])$oldIP([^0-9]|$)/\1$newIP\2/g" input
于 2013-09-20T10:51:01.487 に答える