如何仅替换指定匹配模式行后首次出现的含ForwardX11的行
目标实现方案
你需要的是仅替换Host *段下第一个含ForwardX11的行,其余位置的同类行保留,以下是两种可直接使用的实现:
sed 实现(适配你原有的使用习惯)
直接执行以下命令即可:
sed -i '/^Host \*/,/ForwardX11/{/ForwardX11/s/.*/ ForwardX11 yes/}' /etc/ssh/ssh_config
命令逻辑说明:
- 外层
/^Host \*/,/ForwardX11/是范围匹配,限定所有操作仅作用于「以Host *开头的行」到「第一次出现ForwardX11的行」的区间内 - 内层
/ForwardX11/s/.*/ ForwardX11 yes/表示区间内仅对包含ForwardX11的行执行整行替换,其余行不做改动 - 该命令会自动忽略行首的
#以及原有的yes/no取值,直接替换为目标内容
awk 实现(兼容性更强,适配更复杂的文件结构)
如果你的文件存在Host *段被其他异常内容插入的场景,可以用awk方案实现更稳定的匹配:
awk ' /^Host \*/{in_target_block=1} in_target_block && /ForwardX11/{ print " ForwardX11 yes" in_target_block=0 next } 1' /etc/ssh/ssh_config > tmp_ssh_config && mv tmp_ssh_config /etc/ssh/ssh_config
命令逻辑说明:
- 匹配到
Host *行时,设置标记位in_target_block为1 - 标记位为1时如果命中含ForwardX11的行,输出替换后的内容,同时把标记位设为0,后续所有行都不会再触发替换
- 其余行原样输出
效果验证
以你给出的示例文件为例,执行上述任意命令后的输出结果为:
Host * # ForwardAgent no ForwardX11 yes # ForwardX11Trusted no # AnotherLine no Host localhost ForwardX11 yes
完全符合仅修改Host *段下第一个ForwardX11行、保留其余内容不变的需求。
内容的提问来源于stack exchange,提问作者Eduardo G
相关产品推荐
相关产品推荐

