Bash 替换文件中的IP地址

Bash 替换文件中的IP地址,bash,sed,replace,ip,hostname,Bash,Sed,Replace,Ip,Hostname,Sample.txt文件: ......................... some log file entries some log file entries some log file entries some log file entries This system ip is not found some log file entries some log file entries some log file entries This system IP is 172.16.80.

Sample.txt文件:

.........................
some log file entries
some log file entries
some log file entries
some log file entries
This system ip is not found
some log file entries
some log file entries
some log file entries
This system IP is 172.16.80.10
some log file entries
some log file entries
This system IP:172.16.80.10
some log file entries
some log file entries
some log file entries
Hostname::ip-172.16.80.10.ec2.internal
some log file entries
some log file entries
......................
我想替换文件中的IP地址,而不是主机名,但是它也在更改主机名

我正在使用此命令替换IP地址:

sed s/172.16.80.10/172.16.80.12/g  sample.txt
获取输出

.........................
some log file entries
some log file entries
some log file entries
some log file entries
This system ip is not found
some log file entries
some log file entries
some log file entries
This system IP is 172.16.80.12
some log file entries
some log file entries
This system IP:172.16.80.12
some log file entries
some log file entries
some log file entries
Hostname::ip-172.16.80.12.ec2.internal
some log file entries
some log file entries
......................
(同时更改主机名)

期望输出为

.........................
some log file entries
some log file entries
some log file entries
some log file entries
This system ip is not found
some log file entries
some log file entries
some log file entries
This system IP is 172.16.80.12
some log file entries
some log file entries
This system IP:172.16.80.12
some log file entries
some log file entries
some log file entries
Hostname::ip-172.16.80.10.ec2.internal
some log file entries
some log file entries
......................
代码示例:

while getopts i:h: opt
  do
  case $opt in
  i)
    CurrentLocalIpv4=`curl -s http://169.254.169.254/latest/meta-data/local-ipv4`
    if [[ $OPTARG =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
      sed -i s/"$CurrentLocalIpv4"/"$OPTARG"/g /home/ec2-user/sample.txt
      echo "ip cahnged"
    else
      echo "fail"
    fi
    ;;
    h)
      echo"hostname"  ;;
   esac
 done

使用您的命令,可以按如下方式修改它:

sed 's/172.16.80.10$/172.16.80.12/g' sample.txt
    sed 's/'$CurrentLocalIpv4'$/172.16.80.12/g' sample.txt
也就是说,告诉sed
sed
您只想更改带有要更改的IP的行,这些行后面没有更多字符(172.16.80.10$)

如果在变量($CurrentLocalIpv4)中有要修改的IP,可以按如下方式编写:

sed 's/172.16.80.10$/172.16.80.12/g' sample.txt
    sed 's/'$CurrentLocalIpv4'$/172.16.80.12/g' sample.txt

你能格式化你的输入吗?它是不可访问的,并且还添加了从您使用的命令中获得的输出以及预期的输出…我在这篇文章中做了一些更改是的,但是如果我使用verable而不是直接放置ip,我如何编写这个命令化的's/'$CurrentLocalIpv4'$/'$OPTARG'/g'sample.txt+1,由于其格式,这对于ip地址应该可以正常工作。在一般情况下,变量可以有空格、星号
*
等,您应该像这样双引号引变量:sed
's/'“$CurrentLocalIpv4”$/172.16.80.12/g“sample.txt
,但它仍然很脆弱,因为如果变量中有任何正向斜杠(
/
),它将失败。此外,任何正则表达式元字符(如点
)如果不首先转义,可能会导致意外/不必要的行为。如果我想用于所有其他文件,我该如何做…我正在匹配文件sed-e的/0-9]\{1,3\\.[0-9]\{1,3\.[0-9]\{1,3\\.[0-9]\{1,3\}/172.31.12/g'sample.txt中的ip地址