정규식을 구분 기호로 사용할 때 올바른 구분 기호를 다시 인쇄하는 방법은 무엇입니까?

정규식을 구분 기호로 사용할 때 올바른 구분 기호를 다시 인쇄하는 방법은 무엇입니까?

내 라인은 다음과 같습니다

123-456-789 12.34.56 example

12를 선택하고 2를 추가한 다음 전체 줄을 그대로 인쇄하고 싶습니다. 따라서 결과는 다음과 같아야 합니다.

123-456-789 14.34.56 example

나는 다음과 같은 이상한 표현을 가지고 있습니다.

awk 'BEGIN {FS="[ .]"}{$2=$2+2}{print}'

하지만 그것은 나에게 주었다

123-456-789 14 34 56 example

점이 사라지고 공백으로 대체되었습니다.

답변1

awk '{ split($2,a,"\."); a[1]+=2; $2=sprintf("%d.%d.%d", a[1],a[2],a[3]) } 1' file

또는,

awk '{ split($2,a,"\."); $2=sprintf("%d.%d.%d", a[1] + 2,a[2],a[3]) } 1' file

행을 공백으로 구분된 필드 집합으로 읽습니다. 두 번째 필드를 포인트로 분할하고 결과의 첫 번째 부분에 2를 추가합니다. 그런 다음 결과 레코드를 인쇄하기 전에 두 번째 필드를 점으로 구분된 세 개의 정수로 다시 포맷합니다(인쇄는 1바로가기 인 끝에 있는 항목에 의해 수행됩니다 { print }).

이는 두 번째 레코드가 실제로 세 개의 점으로 구분된 정수라는 것을 알고 있다고 가정합니다.

무슨 일이 일어나고 있는지 매우 명확하고 이해하고 유지 관리하기 쉽기 때문에 이렇게 하는 것입니다.

답변2

하려고 노력하다"다시 덮다" 복합/복합 필드 구분 기호는 특정 값과 전체 레코드의 일관성을 깨뜨릴 수 있습니다.
대신 다음 접근 방식을 사용하십시오.

awk '{ n = substr($2, 1, index($2, ".")); sub(/[^.]+\./, n + 2 ".", $2) }1' file

산출:

123-456-789 14.34.56 example

위 명령은 공백을 기본 필드 구분 기호로 사용하고 $2두 번째 필드에서만 필요한 모든 처리를 수행합니다.

답변3

필드 구분 기호 캡처를 허용하는 함수를 스크립트에서 사용하십시오 split.awk

 awk '{split($0,a,"[- .]",sep); a[4]+=2; for(i in a) printf "%s%s",a[i], sep[i]; printf "\n"}' file

RS또는 및 RT변수를 사용할 수 있습니다.

 awk -v RS='[- .]' 'NR==4{$1+=2} {printf "%s%s",$0,RT}' file <<< '123-456-789 12.34.56 example'

마지막 것은 한 줄에서만 작동합니다.

답변4

젠섭의 멍청이와 함께

gawk '{sub(/[^.]*/,gensub(/([^.]*).*/,"\\1",1,$2)+2,$2)}1' infile

관련 정보