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
ベストアンサー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]+)?/)
(正しい印刷制御を使用することもできます。を参照)。直交周波数領域変調)