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{} 블록에서 입력을 설정합니다.에프생산하다에스구분 기호 및산소산출에프생산하다에스단일 동일 =
문자에 대한 구분 기호입니다.
그래서 우리가 여기서 하고 있는 일은 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]}'