【问题标题】:replace the matched string in a file with ref to multi line用 ref 替换文件中匹配的字符串到多行
【发布时间】:2021-02-12 01:15:13
【问题描述】:

我想用 23c54c8g-f935-260c-2b9f-5cce93eb05d3 替换 KEY 值(Pods-myapp.release.xcconfig) 15c66c8f-f855-461c-8b6f-5ecf94ea05e3 strong> 在我的项目文件“project.pbxproj”中。问题是为其他配置分配了相同的密钥。我尝试使用 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;


【问题讨论】:

  • 请以代码的形式添加您的努力,这是非常鼓励的,谢谢。
  • 请阅读minimal reproducible example。您应该提供包含所有案例、所需输出以及您尝试过的内容的示例输入。然后,我们可以帮助您在您想要的输出和您从第一个版本中获得的内容之间架起桥梁。
  • @Nic3500 更新了问题。感谢您的建议。

标签: bash shell jenkins sed


【解决方案1】:

只要注释和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.pbxprojproject.pbxproj2 中,键位于变量 k1k2 中:

$ 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";

【讨论】:

  • 谢谢。 @David C. Rankin,如果 KEY 行放置在 buildSettings {...}; 中的不同行怎么办?例如:baseConfigurationReference = DF7B54DFD1BD7EF176BA3943 /* Pods-myapp.release.xcconfig */; buildSettings = { KEY = "23c54c8g-f935-260c-2b9f-5cce93eb05d3"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; .. .. .. .. };
  • 当您开始处理术语的可变行距等时,您确实需要转到awksed 是一个 Stream 编辑器,它的目标是在一行内进行替换,并且远不及 awk 灵活,后者基本上是一种独立的编程语言,专门处理记录中的分隔字段(行)。
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2019-03-17
  • 2014-03-12
相关资源
最近更新 更多