如何使用sed搜索文本字符串并作为变量插入批量更新.m配置文件
修正方案
最优简化脚本(无需嵌套循环,单条逻辑处理所有匹配项)
直接通过sed原生捕获组功能实现需求,效率更高且不会出现变量解析、遍历遗漏问题:
#!/bin/bash # 顶层目录配置 script_dir="/project/guis/" # 批量处理所有.m文件 find "$script_dir" -type f -name "*.m" -exec sed -i '/^\(\*FO_.*\)\.parent:.*/a\\1.background: #2b3856' {} \;
提示:如果运行环境是macOS,需将sed命令改为
sed -i '' '/^\(\*FO_.*\)\.parent:.*/a\\1.background: #2b3856' {} \;,兼容BSD版本sed的语法要求。
原脚本问题说明
- 问题1(变量未代入):原脚本中sed语句内的
\$i对$做了转义,导致bash不会将$i解析为变量;如果要在sed中使用shell变量,需保证变量前的$没有被转义且sed语句用双引号包裹,更推荐直接使用sed原生捕获组功能,避免特殊字符导致的变量注入风险。 - 问题2(第二个区块未处理):原脚本中
var1=($(grep '*FO_.*.parent:' $m_file))会按空格分割grep返回的每一行,*FO_mm.parent: FO_mm会被拆成*FO_mm.parent:和FO_mm两个数组元素,后续匹配行被打乱导致无法正常遍历。 - 问题3(提取对象名):如果要从
*FO_mm.parent: FO_mm中提取对象名,可用bash参数扩展${i%.parent:*},直接删除.parent:及之后的所有内容得到*FO_mm;简化方案中直接用sed捕获组\1自动获取对象名,无需额外处理。
效果验证
处理后你的示例区块效果如下:
*FO_test_area.class: Form *FO_test_area.static: true *FO_test_area.parent: FO_mm *FO_test_area.background: #2b3856 *FO_test_area.resizePolicy: "resize_none"
内容的提问来源于stack exchange,提问作者Strang84
相关产品推荐
相关产品推荐

