如何基于grep匹配批量注释多文件中指定连续Shell代码块?
批量注释特定case代码块的实现方法
下面提供两种常用文本处理工具的方案,可批量处理多个文件,精准匹配并注释从case $- in到后续首个esac的连续代码块:
方案一:使用sed命令
sed支持基于模式匹配的地址范围操作,可直接原地修改文件内容:
# 处理单个文件 sed -i '/^case \$- in/,/^esac$/ s/^/#/' your_script.sh # 处理多个文件(比如当前目录下所有.sh脚本) sed -i '/^case \$- in/,/^esac$/ s/^/#/' *.sh
命令说明:
/^case \$- in/,/^esac$/:定义匹配范围——从以case $- in开头的行,到首个以esac开头的行s/^/#/:对范围内的每一行,在行首插入#注释符-i:原地修改文件内容(无需生成临时文件)
方案二:使用awk命令
awk通过状态标记实现多行匹配控制,兼容性更强,适合复杂文本场景:
通用版本(需临时文件中转)
# 处理单个文件 awk '/^case \$- in/{flag=1} flag{print "#"$0; if(/^esac$/){flag=0}} !flag{print $0}' your_script.sh > temp.sh && mv temp.sh your_script.sh # 处理多个文件(循环遍历) for file in *.sh; do awk '/^case \$- in/{flag=1} flag{print "#"$0; if(/^esac$/){flag=0}} !flag{print $0}' "$file" > temp && mv temp "$file" done
GNU awk原地修改版本
如果系统安装了GNU awk(gawk),可直接原地修改:
# 处理单个文件 gawk -i inplace '/^case \$- in/{flag=1} flag{print "#"$0; if(/^esac$/){flag=0}} !flag{print $0}' your_script.sh # 处理多个文件 gawk -i inplace '/^case \$- in/{flag=1} flag{print "#"$0; if(/^esac$/){flag=0}} !flag{print $0}' *.sh
逻辑说明:
- 匹配到
case $- in行时,开启标记flag=1 - 标记开启时,输出行首加
#的内容;若匹配到esac行,关闭标记flag=0 - 标记关闭时,直接输出原行内容
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

