我有一个包含许多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,因为'。'在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
答案 0 :(得分:3)
首先需要在正则表达式中转义点,否则它匹配任何字符。所以设置你的变量:
oldIP="2\.2\.2\.2"
newIP="3.3.3.3"
然后你可以使用这个sed:
sed -r "s/(^|[^:])$oldIP([^0-9]|$)/\1$newIP\2/g" input
在Mac上的OR:
sed -E "s/(^|[^:])$oldIP([^0-9]|$)/\1$newIP\2/g" input