【问题标题】:How to find a substring after a string in a file and increment that number using sed/awk in shell scipting?如何在文件中的字符串之后查找子字符串并在 shell 脚本中使用 sed/awk 递增数字?
【发布时间】:2019-11-23 20:12:35
【问题描述】:

我有一个包含以下内容的 abc.toml 文件:

[env]
    APPLICATION_NAME = 'loy'
    COMPONENT_NAME = 'web-loy'
    AAAS_VERSION='0.0.2'
    AAAS_FLAVOR='apache-base'
    CONF_VERSION='0.0.1'
    SERVICE_VERSION='0.0.2'

我想在 shell 中编写一个脚本,以便我可以调用它并增加版本号。在 CONF_VERSION 中。 即调用脚本后,CONF_VERSION 应该变成 '0.0.2',下一次是 '0.0.3' 等等......

调用脚本一次后的预期输出是:

[env]
    APPLICATION_NAME = 'loy'
    COMPONENT_NAME = 'web-loy'
    AAAS_VERSION='0.0.2'
    AAAS_FLAVOR='apache-base'
    CONF_VERSION='0.0.2'
    SERVICE_VERSION='0.0.2'

【问题讨论】:

    标签: awk sed sh


    【解决方案1】:

    这将增加CONF_VERSION的最后一位数字

    awk '/CONF_VERSION/ {split($2,a,".");++a[3];$0=$1FS a[1]"."a[2]"."a[3]FS}1' FS="'" file
    [env]
        APPLICATION_NAME = 'loy'
        COMPONENT_NAME = 'web-loy'
        AAAS_VERSION='0.0.2'
        AAAS_FLAVOR='apache-base'
        CONF_VERSION='0.0.2'
        SERVICE_VERSION='0.0.2'
    

    PS 你没有写0.0.9 之后应该发生的事情。这个awk 给了0.0.10

    编辑:

    awk '/CONF_VERSION/ {split($2,a,".");if (a[3]==9) {a[3]=0;++a[2]} else {++a[3]};$0=$1FS a[1]"."a[2]"."a[3]FS}1' FS="'" file
    

    此版本将从0.0.9 更改为0.1.0 而不是0.0.10

    【讨论】:

    • 现在的输出是:CONF_VERSION='0.0.2 应该编辑什么以获得输出为 CONF_VERSION='0.0.2'
    • @HarshitGoel 你可以这样做awk 'code' abc.toml > tmp && mv tmp abc.toml
    【解决方案2】:

    这是另一个 awk 版本:

    $ awk -F'[.]' '/CONF_VERSION=/{$3=($3+1)"\x27"} 1' OFS=. abc.toml
    [env]
        APPLICATION_NAME = 'loy'
        COMPONENT_NAME = 'web-loy'
        AAAS_VERSION='0.0.2'
        AAAS_FLAVOR='apache-base'
        CONF_VERSION='0.0.2'
        SERVICE_VERSION='0.0.2'
    

    工作原理

    • -F'[.]'

      这告诉 awk 使用 . 作为输入的字段分隔符。

    • /CONF_VERSION=/{$3=($3+1)"\x27"}

      这只会选择包含CONF_VERSION= 的行。对于这些行,第三个字段增加 1 并附加一个单引号。

      \x27 表示单引号。以这种方式表示,以免混淆外壳。

    • 1

      这告诉 awk 打印该行。

    • OFS=.

      这告诉 awk 使用句点作为输出的字段分隔符。

    就地更新

    如果您有 GNU awk(有时称为 gawk),请使用:

    gawk -i inplace -F'[.]' '/CONF_VERSION=/{$3=($3+1)"\x27"} 1' OFS=. abc.toml
    

    无论 awk 版本如何,以下内容都会更新:

    awk -F'[.]' '/CONF_VERSION=/{$3=($3+1)"\x27"} 1' OFS=. abc.toml >temp && mv temp abc.toml
    

    【讨论】:

    • 要更新文件 abc.toml 我也在使用 :awk -F'[.]' '/CONF_VERSION=/{$3=($3+1)"\x27"} 1' OFS= . abc.toml > abc.toml 但它不起作用。我怎样才能更新文件而不是在控制台上打印?
    • @HarshitGoel 我刚刚在答案末尾添加了两种更新文件而不是在控制台上打印的方法。
    • 运行此命令后,我得到如下输出: 用法:awk [POSIX 或 GNU 样式选项] -f progfile [--] 文件 ... 用法:awk [POSIX 或 GNU 样式options] [--] 'program' file ... POSIX 选项:GNU 长选项:(标准)-f progfile --file=progfile gawk 是一种模式扫描和处理语言。默认情况下,它读取标准输入并写入标准输出。
    • @HarshitGoel 哎呀。我在第二个版本中有错字。试试修正版awk -F'[.]' '/CONF_VERSION=/{$3=($3+1)"\x27"} 1' OFS=. abc.toml >temp && mv temp
    • 谢谢@John1024 这真的很有帮助:)
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多