匹配文件中的精确字符串并更新 IP 地址

匹配文件中的精确字符串并更新 IP 地址

有两个步骤,首先检查文件中是否存在主机

如果有文件:

# FILE: /etc/hosts:
192.168.0.10 srv-db srv-db-home
192.168.0.15 srv-db1
192.168.0.20 srv-db-2
192.168.0.20 srv-db-work srv-db-

将执行:

sed -n -e '/\<srv-db\>/p' /etc/hosts

其结果为:

192.168.0.10 srv-db
192.168.0.20 srv-db-2
192.168.0.20 srv-db-

它忽略了末尾的数字就好了......但它不会忽略破折号(-)。

我发现了一堆可以部分工作的正则表达式...如下两个:

使用 grep 精确匹配字符串

如何使用“sed”匹配精确的字符串?但不是它的一部分。

@steeldriver 的以下答案对此有所帮助:

awk '$NF == "srv-db"' /etc/hosts

但是,当要更新 IP 地址时,它变得模糊,这是我想出的完整代码:

sed -i -e "s/\(^ *[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\(\s*\)\<srv-db\>/192.168.9.9\2/" /etc/hosts

它应该只更新第一行,但它更新的结果与上面相同。

但在这个特殊情况下,没有一个方法能够完美地发挥作用。

答案1

单词\>边界锚点被-视为边界。

如果您知道没有尾随空格,则可以锚定到行尾/\<srv-db$/- 为了允许尾随空格,您可以将其修改为/\<srv-db[[:blank:]]*$//\<srv-db[[:space:]]*$/

或者使用awk并做一个细绳匹配代替:

awk '$NF == "srv-db"' /etc/hosts

如果您不一定锚定到行尾(即使有尾随空格),那么您将需要构造一个表达式来(例如)测试空格或行尾(即“没有连字符的单词边界”),例如(使用扩展正则表达式模式)

sed -En -e '/\<srv-db(\s|$)/p'

如果您可以使用 perl (或 PCRE 模式下的 grep),那么可能有更优雅的选项,例如

perl -ne 'print if /\bsrv-db(?![\w-])/'

或者

grep -P '\bsrv-db(?![\w-])'

相关内容