awkだけを使用して、一致する数字を検索、置換、および増やすことはできますか?

awkだけを使用して、一致する数字を検索、置換、および増やすことはできますか?

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=3fooooobarbaz?cache_version=4fooooo
test1

ello
barbaz?cache_version=3fooooo
bye

条件は、インクルード行を検索し、cache_version=一致する行の値に 1 を追加することです。
増分はもちろん、一致する値も見つかりません。

これまで、私は次のように特定の行だけを見つけました。
awk '{if(/cache_version=([[:digit:]+])/) print $1}' < test1

答え1

数値は常に整数であると仮定します。

awk 'BEGIN{ FS=OFS="=" }
/cache_version/{ match($NF, /^[0-9]+/); $NF=($NF+1) substr($NF, RLENGTH+1) }1' infile

BEGIN{}ブロックで入力を設定します。F生産するS区切り記号と酸素出力F生産するS単一の同一=文字の区切り記号。

だから私たちがここでやっていることは、awk '/pattern-matching(regexp)/ { "actions" }ブロック内のどのタスクが{...}正規表現に一致する行でのみ実行されるかですcache_version

これmatch(s, r [, a]) 関数、場所に戻るsここで正規表現r発生する場合、または次の場合はゼロです。r存在せず、値を設定します。プログラム開始(ここで正規表現の開始位置はr発生)と長さ(サブストリング/正規表現に一致する文字の長さ)。

$NF+1注:私はawkが以下のように文字列を整数に変換するように強制しました。私はその数が$ NFの先頭にあることを知っています(訴えるかもしれませんが)substr($NF,1, RLENGTH)+1また)、次からsubstr($NF, RLENGTH+1)

注:ほぼすべての種類の数字と一致するように正規表現を変更しますmatch($NF, /^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?/)(正しい印刷制御を使用することもできます。を参照)。直交周波数領域変調)

答え2

matchの関数を使用して、gawkグループを配列としてキャプチャし、キャプチャされた数を増やしながら各要素を印刷できます。

echo 'barbaz?cache_version=3fooooo' | gawk 'match($0, /(.*cache_version=)([[:digit:]]+)(foo.*)/, a) {print a[1] a[2]+1 a[3]}'

関連情報