awk의 /RE/ 및 "RE"

awk의 /RE/ 및 "RE"

에서 awk및 함수의 첫 번째 매개변수, 함수의 두 번째 매개변수 및 의 선택적인 세 번째 매개변수는 확장 정규식입니다.sub()gsub()match()split()

이러한 인수는 정규식 또는 정규식 상수로 해석되는 문자열로 평가되는 임의의 표현식일 수 있습니다.

에서는 awk특정 정규식(구문의 "태그")에 대해 정규식 상수가 작성되었습니다./RE/REEREawk

질문:동일하게 유지된다고 가정하면 RE(일부 변수가 아닌 정규식) 호출에서 사용하는 것과 구문에서 "태그"를 /RE/사용하는 것 "RE"사이 에 실질적인 차이가 있습니까? STRING또는: 위 함수를 호출할 때 정규식을 나타내는 두 가지 방법을 구별할 수 있는 알려진 구현이 있습니까?awksub()awk

요청한 이유는 호출에서 awk정규식으로 사용하려는 일부 코드를 수정해야 했던 것을 기억하기 때문입니다. 또는 를 사용하여 함수를 호출하지 않는 한 어떤 이유로든 현재 구현이 잘못된 작업을 수행했기 때문입니다."RE"sub()gsub()awk/RE/

아쉽게도 이건 오래전(2년여 전)이라 자세한 내용은 기억나지 않고, 당시 제가 어떤 유닉스(아마도 OpenBSD)를 사용하고 있었는지는 잘 모르겠지만, 계속 사용하고 있었습니다. 이 질문을하고 싶습니다.

답변1

예, 모든 awk 구현에서 이들 간의 차이점은 백슬래시를 이스케이프 문자로 사용한다는 것입니다. 바라보다https://www.gnu.org/software/gawk/manual/gawk.html#Compulated-Regexps이에 대한 자세한 내용은 다음을 참조하세요.

...슬래시로 묶인 정규식 상수와 큰따옴표로 묶인 문자열 상수 사이에는 차이가 있습니다. 문자열 상수를 사용하려면 문자열이 기본적으로 두 번 검색된다는 점을 이해해야 합니다. 처음에는 awk가 프로그램을 읽고 두 번째에는 awk 왼쪽에 있는 문자열과 일치합니다. 오른쪽 패턴이 있는 연산자입니다. 이는 문자열 상수뿐만 아니라 모든 문자열 값 표현식(예: 이전 예에 표시된 digits_regexp)에 해당됩니다.

문자열을 두 번 스캔하면 어떤 차이가 있습니까? 대답은 이스케이프 시퀀스, 특히 백슬래시와 관련이 있습니다. 문자열 내의 정규식에 백슬래시를 추가하려면 두 개의 백슬래시를 입력해야 합니다.

예를 들어 는 /\*/리터럴 정규식 상수입니다 *. 백슬래시가 하나만 필요합니다. 문자열로 동일한 작업을 수행하려면 를 입력해야 합니다 "\\*". 첫 번째 백슬래시는 두 번째 백슬래시를 이스케이프하여 문자열에 실제로 두 문자 \와 가 포함되도록 합니다 *.

따라서 정규식을 작성할 때 고려해야 할 유일한 사항은 다음과 같은 경우 "RE"가 아닙니다 /RE/.

  1. RE에는 /s가 포함되어 있고 이스케이프 문자가 없으므로 간결하게 작성하는 sub("/foo/bar","")대신 sub(/\/foo\/bar/,"")다음과 같이 작성할 수 있습니다.
  2. 연결하려면 문자열 구분 기호가 필요합니다.var=17; sub("stuff" var,"")

/그렇지 않으면 항상 문자열 구분 기호( ) 대신 정규식 구분 기호( )를 정규식 주위에 사용하십시오 ".

관련 정보