如何在文件中的字符串后找到子字符串并在scipt中使用sed / awk递增该数字?

时间:2019-07-15 06:41:18

标签: awk sed sh

我有一个具有以下内容的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'

2 个答案:

答案 0 :(得分: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'

请注意,您不写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

答案 1 :(得分:1)

这是另一个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