^
줄의 시작 부분과 일치하고 줄 $
의 끝과 일치하면 ^$
줄의 시작 부분 이 아닌 이유는 무엇입니까?그리고제목처럼 문자열 끝인가요?
다음과 같이 문자열과 일치하는 정규식을 만드는 방법은 다음과 같습니다.
" 로 시작하고 s
로 끝납니다 s
."
답변1
그 이유는 정규식 일치가 처리되는 방식에 있습니다(참조:여기예를 들어): 문자열은 왼쪽에서 오른쪽으로 평가되며 역참조를 제외하고 문자열의 모든 기호는 정규식의 토큰(가장 간단한 경우 리터럴 기호 자체)과 일치해야 합니다. 반복 연산자.
핵심은 정규식이 "전체 문자열의 일반 속성"(예: " s
시작 및 끝")을 설명하는 것이 아니라 문자열에 규칙을 적용한다는 것입니다.캐릭터 레벨끈. 그래서, 당신의 정규식
^s$
의미: "문자열의 시작", 그 뒤에하나 s
, 그 뒤에 "문자열의 끝"이 옵니다. 따라서 이는 단일 문자로 구성된 문자열에만 일치합니다 s
. 이는 기술적으로 로 시작하고 끝나는 문자열이지만 s
사용자가 찾고 있는 문자열은 아닙니다.
s
로 시작하고 , 중간에 문자가 있고, 로 끝나는 문자열 을 일치시키려면 s
해당 문자열을 모두 명시적으로 지정해야 합니다.
매우 명확하게 하려면:
- 첫 번째 반복은 다음과 같습니다.
^s.*s$
s
이는 " 로 시작 하고 그 뒤에 임의 유형의 0개 이상의 문자(.*
)가 오고 마지막으로s
문자열의 끝이 오는 문자열과 일치합니다 . - 물론, 이것은아니요다음으로 구성된 문자열과 일치합니다.오직수치
s
. 따라서 두 번째 반복에서는 초기 선택적 섹션 뒤에 섹션을 설정합니다s
(@user414777의 설명 참조).^s(.*s)?$
s
그러면 "로 시작 하고 0개 또는 1회(the?
) ', 모든 유형의 0개 이상의 문자로 구성된 부분 문자열,s
'(의 내용(...)
)이 뒤따르고 바로 뒤에 끝나는 문자열"과 일치합니다 .
이제 질문에 로 태그를 지정했다는 것은 아마도 행이나 문자열이 로 시작하고 끝나는 경우에만 적용되는 규칙에 대한 조건을 생성 awk
한다는 의미일 것입니다 . 이는 다음과 같을 수 있습니다:awk
s
awk '/^s/ && /s$/ { ... }'
와 grep
같은그리고- 구축 자체가 불가능함(구문은 다음과 동일함)-e regex1 -e regex2
또는), 그러나 파이프를 통해 이를 수행할 수 있습니다.
grep "^s" sourcefile.txt | grep "s$"