如何在shell Sciting中使用sed/awk查找文件中字符串后的子字符串并增加该数字?

如何在shell Sciting中使用sed/awk查找文件中字符串后的子字符串并增加该数字?,awk,sed,sh,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中增加版本号。 i、 e调用脚

我有一个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中增加版本号。 i、 e调用脚本后,CONF_版本应为“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'

这将增加
CONF\u版本的最后一位

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

编辑:


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

以下是另一个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'
awk -F'[.]' '/CONF_VERSION=/{$3=($3+1)"\x27"} 1' OFS=. abc.toml >temp && mv temp abc.toml
工作原理
  • -F'[.]'

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

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

    这只选择包含
    CONF\u VERSION=
    的行。对于这些行,第三个字段增加1,并附加一个引号

    \x27
    表示单个报价。它是这样表达的,以免混淆外壳

  • 1

    这会告诉awk打印该行

  • OFS=。

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

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

无论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'
awk -F'[.]' '/CONF_VERSION=/{$3=($3+1)"\x27"} 1' OFS=. abc.toml >temp && mv temp abc.toml

现在的输出是:CONF_VERSION='0.0.2应该编辑什么以获得CONF_VERSION='0.0.2'@HarshitGoel的输出您可以这样做
awk'code'abc.toml>tmp&&mv tmp abc.toml
来更新文件abc.toml,我也在使用:awk-F'[.]''/CONF_VERSION=/{$3=($3+1)”\x27'}1'OFS=。abc.toml>abc.toml,但它不工作。如何更新文件而不在控制台上打印?@HarshitGoel我刚刚在回答的末尾添加了两种更新文件而不是在控制台上打印的方法。运行此操作后,我得到如下输出:用法:awk[POSIX或GNU样式选项]-f progfile[-]file。。。用法:awk[POSIX或GNU样式选项][--]“程序”文件。。。POSIX选项:GNU长选项:(标准)-f progfile--file=progfile gawk是一种模式扫描和处理语言。默认情况下,它读取标准输入并写入标准输出。@HarshitGoel-Oops。我在第二个版本中有一个拼写错误。请尝试更正的版本
awk-F'[.]'/CONF_version=/{$3=($3+1)“\x27”}1'OFS=。abc.toml>temp和mv temp
谢谢@John1024,这真的很有帮助:)