이전 질문에 대한 후속 답변입니다."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
"를 의미합니다.