修改sed反向引用正则,使其支持空格与制表符分隔的/etc/hosts条目
解决sed匹配空格/制表符分隔的hosts条目替换问题
要让你的sed命令同时支持空格和制表符作为分隔符,只需要把原命令里的固定空格替换成匹配空格或制表符的正则表达式即可,以下是具体方案:
基础版(匹配单个空格/制表符)
直接将命令中的空格 替换为[ \t],这个表达式会匹配单个空格或者制表符:
sed 's/\(^.\+\)[ \t]\(.\+compute.internal\)/\1 othername \2/g' /etc/hosts
鲁棒版(匹配一个或多个连续分隔符)
如果你的/etc/hosts里可能存在多个连续的空格或制表符混合作为分隔符,建议用[ \t]+(+表示匹配前面的字符至少一次),这样能兼容更多场景:
sed 's/\(^.\+\)[ \t]\+\(.\+compute.internal\)/\1 othername \2/g' /etc/hosts
原地编辑文件
如果需要直接修改/etc/hosts文件而不是只输出结果,可添加-i参数(不同sed版本略有差异):
- GNU sed(Linux系统):
sed -i 's/\(^.\+\)[ \t]\+\(.\+compute.internal\)/\1 othername \2/g' /etc/hosts - BSD sed(macOS等系统):
sed -i '' 's/\(^.\+\)[ \t]\+\(.\+compute.internal\)/\1 othername \2/g' /etc/hosts
效果示例
不管原条目用空格还是制表符分隔:
原条目(空格分隔):
10.80.0.4 host.compute.internal原条目(制表符分隔):
10.80.0.4 host.compute.internal
替换后都会得到:
10.80.0.4 othername host.compute.internal
内容的提问来源于stack exchange,提问作者gbt
相关产品推荐
相关产品推荐

