有两个步骤,首先检查文件中是否存在主机
如果有文件:
# 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-
它忽略了末尾的数字就好了......但它不会忽略破折号(-)。
我发现了一堆可以部分工作的正则表达式...如下两个:
和
@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-])'