如何分别修改iOS与watchOS的PRODUCT_BUNDLE_IDENTIFIER值?
问题描述
现有Shell脚本里的sed命令:
sed -i -e "s/PRODUCT_BUNDLE_IDENTIFIER =.*/PRODUCT_BUNDLE_IDENTIFIER = abc;/g" text.txt
会把所有PRODUCT_BUNDLE_IDENTIFIER统一改成abc。现在要针对下面的配置内容,分别把iOS Identifier和Apple Watch OS Identifier对应的PRODUCT_BUNDLE_IDENTIFIER改成不同的值:
{ 2D02E400000000001C7 /* iOS Identifier */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_BUNDLE_IDENTIFIER = "com.iOS"; }; name = Debug; }; 2D02E000000000051C7 /* Apple Watch OS Identifier */ = { isa = XCBuildConfiguration; buildSettings = { PRODUCT_BUNDLE_IDENTIFIER = "com.watchOS"; }; name = Debug; }; }
解决方案
可以借助sed的上下文匹配功能,先定位到目标配置块的标识行,再替换块内的PRODUCT_BUNDLE_IDENTIFIER字段:
1. 修改iOS Identifier对应的Bundle ID
用sed匹配包含/* iOS Identifier */的行,然后在后续的配置块内找到目标行替换:
sed -i -e '/\/\* iOS Identifier \*\//,/}.*}/ s/PRODUCT_BUNDLE_IDENTIFIER =.*/PRODUCT_BUNDLE_IDENTIFIER = "com.new.ios";/' text.txt
2. 修改Apple Watch OS Identifier对应的Bundle ID
用同样的逻辑,匹配对应标识行后替换块内字段:
sed -i -e '/\/\* Apple Watch OS Identifier \*\//,/}.*}/ s/PRODUCT_BUNDLE_IDENTIFIER =.*/PRODUCT_BUNDLE_IDENTIFIER = "com.new.watch";/' text.txt
合并成单条命令(可选)
如果想一次性完成两个修改,把两个编辑指令合并即可:
sed -i -e '/\/\* iOS Identifier \*\//,/}.*}/ s/PRODUCT_BUNDLE_IDENTIFIER =.*/PRODUCT_BUNDLE_IDENTIFIER = "com.new.ios";/' \ -e '/\/\* Apple Watch OS Identifier \*\//,/}.*}/ s/PRODUCT_BUNDLE_IDENTIFIER =.*/PRODUCT_BUNDLE_IDENTIFIER = "com.new.watch";/' text.txt
命令说明
/\/\* iOS Identifier \*\//,/}.*}/:定义匹配范围,从包含/* iOS Identifier */的行开始,到配置块的闭合行};结束。s/PRODUCT_BUNDLE_IDENTIFIER =.*/PRODUCT_BUNDLE_IDENTIFIER = "com.new.ios";/:在上述范围内,将原Bundle ID行替换为新值。
内容的提问来源于stack exchange,提问作者wong john
相关产品推荐
相关产品推荐

