대괄호 확장 대신 대체를 사용할 때 grep에서 결과를 얻지 못하는 이유는 무엇입니까?

대괄호 확장 대신 대체를 사용할 때 grep에서 결과를 얻지 못하는 이유는 무엇입니까?

이 경우 결과를 얻지 못하는 이유를 알고 싶습니다.

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는 내가 가장 좋아하지 않는 음악 플레이어입니다.

관련 정보