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{} 블록에서 입력을 설정합니다.에프생산하다에스구분 기호 및산소산출에프생산하다에스단일 동일 =문자에 대한 구분 기호입니다.

그래서 우리가 여기서 하고 있는 일은 awk '/pattern-matching(regexp)/ { "actions" }블록 내의 어떤 작업이 {...}정규식과 일치하는 줄에서만 실행되는지입니다 cache_version.

이것match(s, r [, a]) 함수, 위치로 돌아가기s여기서 정규식r발생하거나 다음과 같은 경우에는 0입니다.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]}'

관련 정보