gawk에서 "^ 백슬래시는 줄의 마지막 문자가 아닙니다."

gawk에서 "^ 백슬래시는 줄의 마지막 문자가 아닙니다."

/각 행 사이 와 ,내부의 숫자를 일치시키고 3씩 증가시키고 싶습니다 . 예를 들어

유비쿼터스 백슬래시/49, 검정색

~이 되다

유비쿼터스 백슬래시/52, 검정색

내 gawk 명령은 다음과 같습니다.

$ gawk '{b=gensub(/\/([0-9]+),/, "/" (\\1+3) ",") ; print b}' add.jpdf 
gawk: cmd. line:1:                    ^ backslash not last character on line

"^ 백슬래시가 마지막 문자가 아닙니다"가 무엇을 의미하는지 궁금합니다. 내 솔루션이 어떤 gawk 구문 규칙을 위반합니까?

감사해요.

답변1

gensub()두 번째 인수로 문자열이 필요합니다. /함수에 의해 평가될 것으로 가정하는 표현식 주위에 합계를 연결 하려고 합니다 ,. (\\1+3)그렇지 않습니다. 함수를 호출하기 전에 함수를 평가하십시오. 정규식에서 \1일치하는 캡처링 그룹을 참조 할 수 있지만 ()표현식이 아닌 문자열에서만 사용할 수 있습니다.

따라서 기껏해야 이를 두 번째 인수로 사용할 수 있지만 "/\\1+3,"결과를 얻게 됩니다 ...Backslash/49+3,Black. 49+3 섹션을 이런 식으로 평가할 수는 없습니다.

일치 항목에 대해 산술 연산을 수행하려면 먼저 문자열을 추출하고 연산을 수행한 다음 다시 문자열에 넣어야 합니다. 예를 들어,

awk '{ n = split($0, d, /\/([0-9]+),/, s)
       print d[1] "/"(substr(s[1],2)+3)"," d[2] }'

이는 gnu awk의 split()함수와 정규식을 사용하여 행을 3부분으로 나눕니다. 즉, 에서 일치하기 전 부분 d[1], 에서 일치 후 부분, d[2]s[1]에서 일치하는 문자열입니다. 정확하게 일치하는 항목이 하나 있는지 확인하려면 2인지 "/49,"확인해야 합니다 .n

"/"그런 다음 초기 문자열을 건너뛰고 산술을 수행한 다음 모든 부분을 다시 연결하여 일치하는 문자열에서 숫자를 추출할 수 있습니다 .


패턴이 데이터 행에 여러 번 나타날 수 있는 경우 더 나은 해결책은 match()마지막 발생 항목만 찾아 다음을 사용하여 행을 자르는 것 입니다 substr().

awk '{ match($0, /.*\/([0-9]+),/, m)
       a = m[1,"start"]
       b = m[1,"length"]
       if(a)print substr($0,1,a-1) substr($0,a,b)+3 substr($0,a+b)
       else print }'

여기서는 마지막 발생 항목만 일치하도록 패턴을 .*앞에 추가했습니다. 정규식에서 캡처링 그룹의 시작 부분의 문자 위치와 길이를 a설정하므로 숫자만 사용됩니다. 마지막 행은 원본 데이터의 다른 두 부분에서 재조립됩니다.()bsubstr($0,a,b)

관련 정보