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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:24:03