我是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
有人可以帮我吗
答案 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