如何在不替换整行的情况下替换第二场比赛

时间:2019-05-12 06:38:57

标签: sed

我有一个带有以下几行的主机文件:

pthread_cond_wait

服务器IP为:192.168.1.1,由下面的IP变量表示:

127.0.0.1
127.0.1.1  servername

我想用$ IP替换以127.0开头的第二个条目,即:

而不是:

IP=192.168.1.1

应该是:

127.0.1.1  servername

我尝试使用以下sed语句:

192.168.1.1 servername

但是它替换了整行,同时也删除了服务器名,然后用:

sed  "0,/127.0.*/! s/127.0.*/$IP/" /etc/hosts

它应该是:

127.0.0.1       localhost.localdomain localhost

192.168.1.1

1 个答案:

答案 0 :(得分:0)

  1. .是一个正则表达式有效字符,您需要使用反斜杠(\)对其进行转义,
  2. .*将匹配所有内容,直到EOL,使用否定的字符类匹配所有内容,直到第一个空白字符为止。
sed '0,/^127\.0\./! s/^127\.0\.[^[:blank:]]*/'"$IP"'/' file

顺便说一句,您可以使用更安全,更可靠地完成此任务:

$ awk -v IP="$IP" 'n<2 && index($1,"127.0.")==1 && ++n==2 { $1=IP } 1' file
127.0.0.1
192.168.1.1 servername