使用bash更新属性文件中的版本号

时间:2018-08-27 12:52:23

标签: bash shell

我是bash脚本的新手,我需要awk的帮助。所以事情是我有一个内部版本的属性文件,我想更新它。

version=1.1.1.0

我用awk做到了

file="version.properties"

awk -F'["]' -v OFS='"' '/version=/{
    split($4,a,".");
    $4=a[1]"."a[2]"."a[3]"."a[4]+1
    }
;1' $file > newFile && mv newFile $file

但是我得到奇怪的结果version =“ 1.1.1.0”“ ... 1

有人可以帮我吗

3 个答案:

答案 0 :(得分:3)

您在评论中提到您要就地更新文件。您可以使用perl在单一代码中做到这一点:

perl -pe '/^version=/ and s/(\d+\.\d+\.\d+\.)(\d+)/$1 . ($2+1)/e' -i version.properties

说明

-e之后是要运行的脚本。使用-p-i的效果是在每一行上运行该脚本,并在脚本进行任何更改时在适当位置修改文件。

脚本本身(为便于解释而分类)是:

/^version=/ and              # Do the following on lines starting with `version=`
s/                           # Make a replacement on those lines
    (\d+\.\d+\.\d+\.)(\d+)/  # Match x.y.z.w, and set $1 = `x.y.z.` and $2 = `w`
    $1 . ($2+1)/             # Replace x.y.z.w with a copy of $1, followed by w+1
    e                        # This tells Perl the replacement is Perl code rather
                             # than a text string.

示例运行

$ cat foo.txt
version=1.1.1.2
$ perl -pe '/^version=/ and s/(\d+\.\d+\.\d+\.)(\d+)/$1 . ($2+1)/e' -i foo.txt
$ cat foo.txt
version=1.1.1.3

答案 1 :(得分:2)

这不是最好的方法,但这是一个解决方法。

测试用例

我假设输入文件中至少有一行正好为version=1.1.1.0

$ awk -F'["]' -v OFS='"' '/version=/{
>     split($4,a,".");
>     $4=a[1]"."a[2]"."a[3]"."a[4]+1
>     }
> ;1'    <<<'version=1.1.1.0'

输出:

version=1.1.1.0"""...1

"""是因为您要分配给字段4($4)。执行此操作时,awk在字段1和2、2和3以及3和4之间添加字段分隔符(OFS)。在您的示例中,三个OFS => """。 / p>

最小变化

$ awk -F'["]' -v OFS='"' '/version=/{
    split($1,a,".");
    $1=a[1]"."a[2]"."a[3]"."a[4]+1; 
    print
}
'        <<<'version=1.1.1.0'
version=1.1.1.1

两项更改:

  • $4更改为$1

    • 由于输入字段分隔符(-F["],所以$4等于第三个"之后的数字(如果输入中有分隔符)。因此,split($4, ...)拆分一个空字段。该行的内容在第一个"之前(如果有的话)在$1中。
  • print而不是;1

    • 右花括号后的1是下一个条件,并且未指定操作。默认操作是修改后打印当前行,因此1触发打印。相反,在完成处理后,只需在您的操作内print。这样一来,您的操作就可以独立完成。 (当然,如果需要执行其他处理,则可能需要在该处理之后再打印。)

答案 2 :(得分:1)

您可以使用=作为分隔符,如下所示:

awk -F= -v v=1.0.1 '$1=="version"{printf "version=\"%s\"\n", v}' file.properties