"백슬래시는 데이터에서 특별한 의미가 없기 때문에 첫 번째 필드에 추가 백슬래시가 필요하지 않은" 이유는 무엇입니까?

"백슬래시는 데이터에서 특별한 의미가 없기 때문에 첫 번째 필드에 추가 백슬래시가 필요하지 않은" 이유는 무엇입니까?

awk 프로그래밍 언어에서

일치 표현식에서 와 같은 따옴표 붙은 문자열은 "^[0-9]+$"와 같이 슬래시로 묶인 정규 표현식과 같은 의미로 사용되는 경우가 많습니다 /^[0-9]+$/. 그러나 한 가지 예외가 있습니다. 인용된 문자열이 정규식 메타 문자의 리터럴 발생과 일치하는 경우 백슬래시 자체를 보호하기 위해 추가 백슬래시가 필요합니다. 그건,

$0  ~ /(\+|-)[0-9]+/ 

그리고

$0  ~ "(\\+|-)[0-9]+"

동등합니다.

이 동작은 이상해 보일 수 있지만 awk가 인용 문자열을 구문 분석할 때 보호 백슬래시 계층을 제거하기 때문에 발생합니다. 정규식에서 특별한 의미를 닫기 위해 메타 문자 앞에 백슬래시를 붙여야 하는 경우 문자열 내에서 이를 보호하려면 백슬래시 앞에 백슬래시를 붙여야 합니다.

일치 연산자의 오른쪽 피연산자가 다음과 같은 변수 또는 필드 변수인 경우

X  ~ $1 

그러면 백슬래시는 데이터에서 특별한 의미가 없으므로 첫 번째 필드에는 추가 백슬래시가 필요하지 않습니다.

마지막 문장은 무슨 뜻인가요?

"백슬래시는 데이터에서 특별한 의미가 없기 때문에 첫 번째 필드에 추가 백슬래시가 필요하지 않은" 이유는 무엇입니까?

감사해요.

답변1

그 의미는데이터상대적인끊임없는"abc"또는 88또는 은 awk 프로그램에 나타나는 상수이지만 awk 변수에는 데이터가 포함되어 있거나 입력에서 읽은 데이터가 포함되어 있습니다. 데이터는 구문 분석되지 않지만 awk 프로그램의 텍스트 본문에 있는 상수는 구문 분석됩니다./a|b/$0

x+y...z1 이상이 있는 입력과 일치시키려고 하여 y정규 표현식이 필요하지만 이스케이프해야 한다고 가정해 보겠습니다. 그렇지 않으면 +1 이상을 의미합니다 x. 따라서 다음 중 하나를 사용할 수 있습니다.

awk 'BEGIN{ a = "x\\+y+z"; print a }
     NR==1{ b = $0; print b; next }
     $0 ~ a            {print "match a " $0 }
     $0 ~ b            {print "match b " $0 }
     $0 ~ /x\+y+z/     {print "match 2 " $0 }
     $0 ~ "x\\+y+z"    {print "match 3 " $0 }
' <<\!
x\+y+z
x+yyyyz
!

마지막 네 줄은 모두 동일한 내용과 일치한다고 인쇄합니다. 예를 들어 변수 의 데이터 값이 상수로 구문 분석되었음을 x+yyyyz나타내는 것은 입력 데이터의 첫 번째 줄에서 변수 의 구문 분석되지 않은 데이터 값을 읽는 것과 동일합니다. 표현식 수식 상수와 문자열 상수는 동일한 형식입니다.print aax\+y+zprint bb

관련 정보