如何使用sed/Perl单行命令仅全匹配替换/etc/fstab中的路径
问题原因
你当前使用的sed命令是全局匹配任意位置的/var/kafka子串,第一次替换后生成的/var/kafka/hadoop_kafka路径本身也包含/var/kafka片段,重复执行命令时会再次触发替换,导致后缀反复拼接。
解决方法
可以通过限定匹配范围为完整独立的挂载点字段实现精准替换,有两种常用方案:
方案1:匹配挂载点前后的空白分隔符
fstab文件中各字段用空格分隔,挂载点/var/kafka作为独立的第二个字段,前后一定有空格。我们可以把sed的分隔符换成#避免大量转义斜杠,命令如下:
# 仅预览修改结果,不实际改动文件 sed 's#\s/var/kafka\s# /var/kafka/hadoop_kafka #' /etc/fstab # 确认无误后加-i参数直接修改文件,同时自动生成.bak备份文件防止改错 sed -i.bak 's#\s/var/kafka\s# /var/kafka/hadoop_kafka #' /etc/fstab
方案2:先匹配行规则再替换(更稳妥)
如果只需要修改/dev/sdb对应的挂载点,可以先匹配整行特征,命中后再执行替换,完全避免误改其他行:
# 预览效果 sed '/^\/dev\/sdb \/var\/kafka / s#/var/kafka#/var/kafka/hadoop_kafka#' /etc/fstab # 实际修改并生成备份 sed -i.bak '/^\/dev\/sdb \/var\/kafka / s#/var/kafka#/var/kafka/hadoop_kafka#' /etc/fstab
两种方案都只会匹配完整独立的/var/kafka路径,重复执行不会出现重复拼接后缀的问题。
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

