如何编写Bash脚本仅精准匹配替换特定开头的IP地址?
问题原因
你写的sed命令存在两个核心错误:
- 正则中的
.默认是通配符,可以匹配任意单个字符,并不会只匹配字面量的小数点,导致匹配范围完全失控 - 没有限定匹配的边界,嵌套在其他字段中的符合
x+任意字符+111+任意字符规则的内容也会被误替换
解决方案
如果你要精准匹配字段开头(前面为空格/行首)的字面量x.111.,替换为Z.,使用如下命令即可:
sed -i -E 's/(^|[[:space:]])x\.111\./\1Z./g' test.txt
命令说明
-E参数开启扩展正则支持,不用额外转义括号(^|[[:space:]])限定匹配内容的前缀必须是行首或者空白符(空格、制表符等),避免匹配到Y8.x.111这类嵌套在其他字段中的内容x\.111\.里的.都加了转义符\,只会匹配字面量的小数点,不会作为通配符使用\1是反向引用,把前面匹配到的行首/空白符补回来,避免替换后丢失字段分隔
如果你的匹配规则是其他边界,只需要调整(^|[[:space:]])部分的前缀规则即可。
内容的提问来源于stack exchange,提问作者CXR
相关产品推荐
相关产品推荐

