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
相关产品推荐
相关产品推荐

