You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux sed命令:匹配指定模式后替换下一行并保留对应缩进

解决方案:精准替换特定上下文的Python代码行

方法一:使用sed动态保留缩进

直接用sed匹配目标注释行,处理下一行时捕获所有前置空格,再替换条件判断语句,不管原缩进是14还是18个空格,都能完美保留:

# 预览修改效果(不修改原文件)
sed '/# Create a zProv customer as well/{n;s/\( *\)if is_production:/\1if is_staging:/}' file.py

# 原地修改原文件
sed -i '/# Create a zProv customer as well/{n;s/\( *\)if is_production:/\1if is_staging:/}' file.py

命令说明:

  • /# Create a zProv customer as well/:定位到包含目标注释的行
  • {n;...}:处理该行的下一行
  • s/\( *\)if is_production:/\1if is_staging:/:用\( *\)捕获所有前置空格,替换后续判断语句时保留这些空格

方法二:使用awk实现更直观的匹配替换

如果sed的语法让你觉得绕,awk的写法更易读,同样能保留原缩进:

awk '
/# Create a zProv customer as well/ {
    print $0          # 打印原注释行
    getline           # 读取下一行
    sub(/if is_production:/, "if is_staging:")  # 替换目标内容
    print $0          # 打印修改后的行
    next              # 跳过后续处理
}
1' file.py > temp.py && mv temp.py file.py

命令说明:

  • 匹配到目标注释行时,先打印该行,再读取下一行做替换
  • 1表示打印所有未被特殊处理的行
  • 通过临时文件实现原地修改(awk本身不支持直接原地替换)

为什么之前的sed命令出错?

大概率是你之前的命令硬编码了固定数量的空格(比如写死14个空格),导致第二处18个空格的行无法匹配,或者替换后缩进被覆盖。上面的两种方法都是动态捕获前置空格,完全适配不同的缩进长度。

内容的提问来源于stack exchange,提问作者Dipankar Nalui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:21:06