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

MacOS Mojave下如何用命令行工具实现多行正则匹配替换

如何在MacOS Mojave下替换Unity ProjectSettings.asset中指定的Bundle Identifier

针对你遇到的问题——需要鲁棒地替换ProjectSettings.asset里applicationIdentifier块下的iPhone对应的Bundle ID,而不依赖块内其他平台行的存在,这里提供两种适配MacOS Mojave的解决方案:

方案一:使用BSD sed(系统自带)

MacOS自带的是BSD版本的sed,和Linux的GNU sed参数略有不同,我们可以利用地址范围匹配来锁定applicationIdentifier的缩进块,再替换其中的iPhone行:

sed -i '' -E '/applicationIdentifier:/,/^[^ ]/{s/^(\s*iPhone: ).*/\1de.newcompany.JenkinsBuildTest/}' ProjectSettings.asset

命令解释:

  • -i '':实现原地编辑文件,空字符串表示不生成备份文件;如果需要保留原文件备份,可以改成-i.bak,会生成ProjectSettings.asset.bak的备份
  • -E:启用扩展正则表达式,让语法更简洁
  • /applicationIdentifier:/,/^[^ ]/:定义一个匹配范围——从包含applicationIdentifier:的行开始,直到遇到开头没有空格的行(也就是退出applicationIdentifier的缩进块)
  • s/^(\s*iPhone: ).*/\1de.newcompany.JenkinsBuildTest/:在上述范围内,匹配以任意空格开头、后跟iPhone: 的行,把iPhone: 之后的内容替换为你需要的新Bundle ID

这个方法的优势是不管applicationIdentifier块里有多少其他平台的配置行(比如有没有Standalone),只要是在这个缩进块内的iPhone行,都会被精准替换。

方案二:使用awk(更直观的块处理)

如果你觉得sed的语法有点绕,awk的块处理逻辑会更清晰:

awk '/applicationIdentifier:/ {in_block=1} in_block && /^[^ ]/ {in_block=0} in_block && /iPhone:/ {$2="de.newcompany.JenkinsBuildTest"}1' ProjectSettings.asset > temp_settings && mv temp_settings ProjectSettings.asset

命令解释:

  1. /applicationIdentifier:/ {in_block=1}:当匹配到applicationIdentifier:行时,标记in_block为1,表示进入目标配置块
  2. in_block && /^[^ ]/ {in_block=0}:如果已经在目标块内,且遇到开头没有空格的行,标记in_block为0,表示退出目标块
  3. in_block && /iPhone:/ {$2="de.newcompany.JenkinsBuildTest"}:在目标块内匹配到iPhone:行时,把第二个字段(也就是原Bundle ID)替换为新值
  4. 1:awk的默认动作,打印所有行
  5. 最后通过临时文件中转再替换原文件,因为awk没有原生的原地编辑功能,这种方式在Mac下更安全

验证场景

比如你的applicationIdentifier块如果是这样(没有Standalone行):

applicationIdentifier:
  Android: de.company.JenkinsBuildTest
  iPhone: de.company.JenkinsBuildTest

上述两种方案都能正确把iPhone对应的Bundle ID替换为de.newcompany.JenkinsBuildTest。

内容的提问来源于stack exchange,提问作者cyx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:23:53