이 경우 결과를 얻지 못하는 이유를 알고 싶습니다.
echo "This doesn't work." | grep -E '[[:upper:]]([[:upper:]] | [[:lower:]])*\.'
저는 Grep에서 정규식을 배우고 있는데 여기서 하고 싶은 것은 입력이 문장인지 감지하는 것입니다. 이를 위해 확장 옵션과 함께 grep을 사용하고 대문자로 시작하고 그 뒤에 대문자와 소문자의 개수가 오고 마침표로 끝나는 모든 입력을 일치시키려고 합니다. 문제는 입력이 일치하지 않으며 그 이유를 이해할 수 없다는 것입니다.
실제 예는 다음과 같습니다.
echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
왜 우리에게 필요한가요? 닫기 전에 두 번째 대괄호 확장에서 [:lower:] 뒤에 공백이 있습니까? 일하는 데 왜 필요한가요?
답변1
당신의 표현에는 기본적으로 두 가지 "잘못"이 있습니다. 첫째, 일치하는 것이 허용되지 않습니다 '
. 둘째, ([[:upper:]] | [[:lower:]])*
유사한 문자열이 일치됩니다 A A a a
(예: 일련의 대문자 뒤에 공백이 오거나 일련의 소문자 뒤에 공백이 오는 경우).
문자열을 일치시키고 This doesn't work.
, 대문자 T
와 점을 명시적으로 일치시키고, 대문자, 소문자, 공백 및 '
그 사이의 모든 항목을 일치시키는 데 필요한 사항은 다음과 같습니다.
$ echo "This doesn't work." | grep -E "[[:upper:]]([[:upper:]]| |'|[[:lower:]])*\."
This doesn't work.
이것은 다음과 같이 쓰는 것이 더 좋습니다.
$ echo "This doesn't work." | grep "[[:upper:]][[:upper:][:lower:]' ]*\."
This doesn't work.
( [:upper:]
이 경우 두 번째 항목은 실제로 테스트 문자열에 의해 트리거되지 않더라도 사용할 수 있습니다 [[:upper:]][[:lower:]' ]*\.
.)
괄호로 묶인 표현식 내의 공백은 텍스트의 실제 공백과 일치하도록 허용됩니다. 해당 공백이 없으면 패턴이 일치하지 않습니다(테스트 문자열에 두 개의 공백이 있음). 그렇기 '
때문에 해당 문자를 포함시켰습니다. 분명히 해당 문자가 포함된 텍스트를 일치시키길 원하기 때문입니다.
답변2
첫 번째 예:
대문자 다음에 임의 개수의 대문자 또는 소문자를 찾고 있으며 0번에서 무한번 반복됩니다. 그러나 귀하의 문장에는 공백과 구두점( '
)이 포함되어 있습니다. 정규식은 매우 강력하지만 달성하려는 목표에 적합한 도구는 아니라고 생각합니다. 우선, 문장은 다양한 구두점으로 끝날 수 있습니다. 게다가 문장에 포함될 수 있는 문자에는 사실상 제한이 없습니다.
나는 rm에서 항상 "--"를 사용해야 한다고 말한 사람이 Stéphane이라고 믿습니다!
이건 그냥 문장 아닌가요?
두 번째 예에서 공백이 필요한 이유는 첫 번째 예가 작동하지 않는 이유와 같습니다. 문장에 공백이 있습니다.
다음과 같은 것을 사용할 수 있습니다:
[A-Z](\s|\S)+[.!?]
그러나 이는 대문자(영어) 문자로 시작하고 구두점으로 끝나는 모든 항목과 일치할 뿐이며 그 사이의 어떤 항목도 실제로 고려하지 않습니다.
또는 다음과 같은 문장은 어떻습니까?
iTunes는 내가 가장 좋아하지 않는 음악 플레이어입니다.