首页 > 解决方案 > 用 ref 替换文件中匹配的字符串到多行

问题描述

我想 在我的项目文件“project.pbxproj”中用23c54c8g-f935-260c-2b9f-5cce93eb05d3替换 KEY 值(Pods-myapp.release.xcconfig) 15c66c8f-f855-461c-8b6f-5ecf94ea05e3 。问题是为其他配置分配了相同的密钥。我尝试使用 sed 根据事件替换密钥。但是我想确保在正确的位置替换键值,即使文件中的配置(发布、调试、企业)顺序发生了变化。

        baseConfigurationReference = DF7B54DFD1BD7EF176BA3943 /* Pods-myapp.release.xcconfig */;
        buildSettings = {
                KEY = "15c66c8f-f855-461c-8b6f-5ecf94ea05e3";
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
.
.
.
    baseConfigurationReference = F997700201F34D7A8AEFA5E3 /* Pods-myapp.enterprise.xcconfig */;
            buildSettings = {
                KEY = "15c66c8f-f855-461c-8b6f-5ecf94ea05e3";
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;

我试图更换

export KEY='15c66c8f-f855-461c-8b6f-5ecf94ea05e3'
export RELEASE_APP_KEY='23c54c8g-f935-260c-2b9f-5cce93eb05d3'

sed -i '' "1/$KEY/s/$KEY/$RELEASE_APP_KEY/" project.pbxproj

如果在第 2 次或第 n 次出现时找到 Release 配置的键值,如何替换它。

    baseConfigurationReference = F997700201F34D7A8AEFA5E3 /* Pods-myapp.enterprise.xcconfig */;
            buildSettings = {
                KEY = "15c66c8f-f855-461c-8b6f-5ecf94ea05e3";
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
.
.
.
        baseConfigurationReference = DF7B54DFD1BD7EF176BA3943 /* Pods-myapp.release.xcconfig */;
        buildSettings = {
                KEY = "15c66c8f-f855-461c-8b6f-5ecf94ea05e3";
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;


标签: bashshelljenkinssed

解决方案


只要注释和 then 之间的行数KEY固定为2,您可以这样做sed

sed '/Pods-myapp.release.xcconfig/{n;n;/KEY/s/15c66c8f-f855-461c-8b6f-5ecf94ea05e3/23c54c8g-f935-260c-2b9f-5cce93eb05d3/;}'

或者为了缩短您可以将键分配给变量的内容并执行以下操作:

k1=15c66c8f-f855-461c-8b6f-5ecf94ea05e3
k2=23c54c8g-f935-260c-2b9f-5cce93eb05d3
sed "/Pods-myapp.release.xcconfig/{n;n;/KEY/s/$k1/$k2/;}" project.pbxproj

解释

基本上上面的命令在/locate/{n;n;/match/s/k1/k2;}哪里:

  • /locate/定位包含"Pods-myapp.release.xcconfig"然后的行
  • {n;n;读取(跳过)两行,
  • /match/(可选)确保该行包含"KEY",然后
  • 您的正常替代形式k1被替换为k2.

示例使用/输出

文件的两个不同顺序位于project.pbxprojandproject.pbxproj2中,键位于变量k1and中k2

$ sed "/Pods-myapp.release.xcconfig/{n;n;/KEY/s/$k1/$k2/;}" project.pbxproj
        baseConfigurationReference = DF7B54DFD1BD7EF176BA3943 /* **Pods-myapp.release.xcconfig** */;
        buildSettings = {
                KEY = "23c54c8g-f935-260c-2b9f-5cce93eb05d3";
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
.
.
.
    baseConfigurationReference = F997700201F34D7A8AEFA5E3 /* Pods-myapp.enterprise.xcconfig */;
            buildSettings = {
                KEY = "15c66c8f-f855-461c-8b6f-5ecf94ea05e3";
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;

$ sed "/Pods-myapp.release.xcconfig/{n;n;/KEY/s/$k1/$k2/;}" project.pbxproj2)
    baseConfigurationReference = F997700201F34D7A8AEFA5E3 /* Pods-myapp.enterprise.xcconfig */;
            buildSettings = {
                KEY = "15c66c8f-f855-461c-8b6f-5ecf94ea05e3";
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
.
.
.
        baseConfigurationReference = DF7B54DFD1BD7EF176BA3943 /* Pods-myapp.release.xcconfig */;
        buildSettings = {
                KEY = "23c54c8g-f935-260c-2b9f-5cce93eb05d3";

推荐阅读