https://stackoverflow.com/a/14348899/15603477
我确实理解以下答案。
sed -r 's/(.*)(\?cache_version=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' file
但我想知道如何在awk中做到这一点。
转换barbaz?cache_version=3fooooo
为文件内容barbaz?cache_version=4fooooo
为test1
ello
barbaz?cache_version=3fooooo
bye
条件是找到行包含cache_version=
然后将匹配行中的数值加1。
我什至找不到匹配的数值,更不用说增加数值了。
到目前为止,我只通过
awk '{if(/cache_version=([[:digit:]+])/) print $1}' < test1
假设数字始终是整数:
在BEGIN { } 块中,我们将输入字段分隔符和输出字段分隔符设置为单个相等字符;
=
然后在这里我们正在做
awk '/pattern-matching(regexp)/ { "actions" }
,块内的哪些动作{...}
将仅针对与正则表达式匹配的行运行cache_version
;match(s, r [, a]) 函数,返回
s
正则表达式r
出现的位置,如果r
不存在则返回零,并设置RSTART (正则表达式的起始位置r
)和RLENGTH (匹配的子字符串/正则表达式的字符长度)。注意:我曾经
$NF+1
强制 awk 进行字符串到整数的转换,因为我知道数字位于 $NF 的起始位置(虽然您也可以起诉substr($NF,1, RLENGTH)+1
),然后从substr($NF, RLENGTH+1)
.注意:更改 , 中的正则表达式
match($NF, /^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?/)
以匹配几乎所有类型的数字(您可能也想使用正确的打印控件,请参阅OFMT)您可以使用
match
in 函数gawk
将组捕获到数组中,并在递增捕获的数字时打印出每个元素: