Mac OS下Shell/Bash批量处理文件:匹配行替换指定内容求助
解决Mac下批量替换指定行内容的问题
我来帮你搞定这个需求!Mac自带的sed是BSD版本,和Linux上的GNU sed语法有些差异,这大概率是你之前没成功的原因。下面给你几个经过验证的可行方案,按需选择就行:
方案1:用Mac版sed实现原地替换
这应该是最直接的方式,注意Mac sed的-i参数需要加空引号(避免生成备份文件):
# 单个文件处理 sed -i '' '/STRING-REPLACE-VAL##/s/VAL15/VAL20/g' your-source-file.cs # 批量处理当前目录下所有.cs文件 sed -i '' '/STRING-REPLACE-VAL##/s/VAL15/VAL20/g' *.cs # 递归处理子目录里的所有.cs文件(结合find) find . -name "*.cs" -type f -exec sed -i '' '/STRING-REPLACE-VAL##/s/VAL15/VAL20/g' {} +
参数说明:
-i '':原地修改文件,空引号是Mac sed的要求,不加会生成.bak备份文件/STRING-REPLACE-VAL##/:只匹配包含该标记的行s/VAL15/VAL20/g:在匹配的行里全局替换VAL15为VAL20(g表示替换该行所有匹配项,不加的话只替换第一个)
方案2:用awk实现替换(适合复杂逻辑场景)
awk的语法更灵活,适合后续可能扩展的需求,不过需要借助临时文件完成原地替换:
# 单个文件处理 awk '/STRING-REPLACE-VAL##/{gsub(/VAL15/, "VAL20")}1' your-source-file.cs > temp-file && mv temp-file your-source-file.cs # 批量处理当前目录下所有.cs文件 for file in *.cs; do awk '/STRING-REPLACE-VAL##/{gsub(/VAL15/, "VAL20")}1' "$file" > temp && mv temp "$file" done
逻辑说明:
/STRING-REPLACE-VAL##/{gsub(...)}:匹配到标记行时,全局替换目标字符串1:表示打印所有行(不管是否匹配,保证文件内容完整)
方案3:用Perl实现(语法接近GNU sed,无兼容性问题)
Mac默认自带Perl,它的原地替换语法和GNU sed更像,不容易踩坑:
# 单个文件处理 perl -pi -e '/STRING-REPLACE-VAL##/ && s/VAL15/VAL20/g' your-source-file.cs # 批量处理当前目录下所有.cs文件 perl -pi -e '/STRING-REPLACE-VAL##/ && s/VAL15/VAL20/g' *.cs # 递归处理子目录文件 find . -name "*.cs" -type f -exec perl -pi -e '/STRING-REPLACE-VAL##/ && s/VAL15/VAL20/g' {} +
参数说明:
-pi:原地编辑并打印内容(相当于sed的-i+默认打印)-e:执行后续的脚本逻辑,匹配到标记行时才执行替换
效果验证
针对你给出的示例行:
Private const String myTestString = @"VAL15"; // STRING-REPLACE-VAL##
执行上述任意命令后,都会替换为:
Private const String myTestString = @"VAL20"; // STRING-REPLACE-VAL##
完全符合你的需求!
内容的提问来源于stack exchange,提问作者SwiftyCocoa
相关产品推荐
相关产品推荐

