적어도 하나의 소문자가 포함된 단어를 찾도록 이 정규식을 어떻게 수정합니까 grep -E -e '^[S][a-z]+, [^S][a-z]+' People.txt
? 내가 사용하는 정규식은 대문자 S로 시작하고 쉼표, 공백, S 이외의 문자로 시작하는 첫 번째 이름을 검색하는 것입니다. 나는 이 정규식을 수정하여 이와 같은 이름도 찾을 수 있도록 하고 싶습니다 SbBBB, PaUU
.MacBook의 터미널에서 grep을 사용합니다.
Smith(이름) Paul(이름)
텍스트 파일
Smith, Paul
SbBBB, PaUU
Pau, Smi
Smi, Smi
SA, PA
정규식 출력
Smith, Paul
SbBBB, PaUU
답변1
이것은 아마도 당신이 하고 싶은 일일 것입니다. POSIX 규격을 사용하고 두 번째 단어의 시작 부분을 제외하고 영어 대문자를 grep
일치시키려고 한다고 가정합니다 .S
$ grep '^S[[:alpha:]]*[[:lower:]][[:alpha:]]*, [ABCDEFGHIJKLMNOPQRTUVWXYZ][[:alpha:]]*[[:lower:]][[:alpha:]]*' file
Smith, Paul
SbBBB, PaUU
답변2
$ grep -Px 'S\pL*\p{Ll}\pL*, (?!S)\p{Lu}\pL*\p{Ll}\pL*' < your-file
Smith, Paul
SbBBB, PaUU
S
다음 으로 시작하는 줄을 보고합니다.편지L
(etter rperty 문자 p
), 그 뒤에 1개의 소문자, 그 뒤에 임의의 수의 문자가 옵니다.편지그 뒤에 ", "
, 대문자, 그리고 S
하나 이상의 소문자를 포함한 여러 글자가 옵니다.
PCRE는 \pL
POSIX와 마찬가지로 [[:alpha:]]
알파벳 문자에만 국한되지 않고 모든 스크립트의 단어 문자를 포함합니다. [\p{Ll}\p{Lu}]
소문자 또는 대문자로 간주될 수 있는 문자만 일치시키거나 \p{Latin}
다음의 모든 문자 와 일치시키려면 with로 바꿀 수 있습니다.라틴어예를 들어 스크립트(영어, 프랑스어, 스페인어 등에서 사용됨)와 (?=\p{Latin})\p{Ll}
라틴어 스크립트의 소문자만(그리스어, 키릴 문자 등의 스크립트의 소문자는 해당되지 않음)입니다.
이를 사용 하고 US ASCII 문자 집합의 26개 소문자만 일치시키려면 로케일을 / [a-z]
로 수정해야 하며 그런 다음 PCRE도 필요하지 않습니다.C
POSIX
L='[A-Za-z]' Ll='[a-z]'
LC_ALL=C grep -x "S$L*$Ll$L*, [A-RT-Z]$L*$Ll$L*"
Serra, Éric
예를 들어, C 로케일에서는 É
와 일치하지 않기 때문에 on 과 일치하지 않습니다.[A-RT-Z]