sed를 구두로 읽기 괄호 안의 정규식 캐럿, 괄호 바깥의 별표

sed를 구두로 읽기 괄호 안의 정규식 캐럿, 괄호 바깥의 별표

이전 질문에 대한 후속 답변입니다."sed는 해당 줄의 첫 번째 패턴 일치만 인쇄합니다."

내가 작업하는 데이터

... "one" ... "two" ... "three" ...

인쇄하고 싶은데 one허용되는 답변은 다음과 같습니다.

sed 's/[^"]*"\([^"]*\)".*/\1/'

이 정규식을 검색하고 이해하려고 노력했지만 이 정규식을 이해할 수 없습니다.

내 이해는 다음과 같습니다

  • [^"]일치하지 않음을 나타냅니다."
  • *0 이전의 모든 문자 수와 일치함을 나타냅니다.*
  • \(\)나중에 해당 번호로 참조할 수 있도록 둘 사이에 일치하는 모든 항목을 저장하는 것을 의미합니다. 즉, 우리의 경우 에는\1
  • .*탐욕적입니다. 즉, 임의의 문자 수를 의미합니다.

[^"]*여기서의 의미를 이해하지 못합니다 .

여기서 무슨 일이 일어나고 있는지 이해하기 위해 전체 정규식을 구두로 어떻게 읽어야 합니까?

sed 's/[^"]*"\([^"]*\)".*/\1/'

답변1

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  [^"]*                    any character except: '"' (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  "                        '"'
--------------------------------------------------------------------------------
  \(                        group and capture to \1:
--------------------------------------------------------------------------------
    [^"]*                    any character except: '"' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  \)                        end of \1
--------------------------------------------------------------------------------
  "                        '"'
--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))

sed명령의 두 번째 부분은 \1괄호를 사용하여 "캡처된" 항목을 호출합니다. 전체 sed명령 자체는 정규식이 아니라는 점에 유의해야 합니다 . 구성에서 s/needle/pin/g정규식은 needle또는 정규식을 "포장"하려는 경우(예: for awk) 입니다 /needle/.

답변2

[^"]*이는 "따옴표가 아닌 모든 문자 수"를 의미하고 정규식 sed은 탐욕적이므로 [^"]*다음 인용문이 문자열의 첫 번째 인용문인지 확인하세요. 두 번째 유사한 정규 표현식은 다음 인용문이 문자열의 두 번째 인용문임을 보장합니다. .*두 번째 인용문 다음에 나오는 내용과 일치합니다.

즉, [^"]*"\([^"]*\)".*"전체 줄을 일치시키고 두 번째 따옴표로 구분된 필드를 입력합니다 \1"를 의미합니다.

관련 정보