linux: 텍스트에 5글자만 포함된 성을 찾습니다.

linux: 텍스트에 5글자만 포함된 성을 찾습니다.

이름, 성, 전화번호. 다음은 텍스트입니다.

Hace, Apoio, 703-2101 
Yoliot, Apostolos, 4222-1124
 Jenny,Thano,105-4122 
 Heriom,Koun, 510-4122 
 Dekon, Atolo, 502-2522 
 Feow, R,685-3431

5글자로 된 모든 성을 찾고 싶습니다.

편집하다:나는 노력했다

egrep -i '[^:]+[a-z]5$' file2 

하지만 이건 작동하지 않아

답변1

awk -F '[[:blank:]]*,[[:blank:]]*' 'length($2) == 5'

선택적으로 공백으로 둘러싸 이도록 필드 구분 기호를 설정 ,하고 두 번째 필드 길이는 보고서 줄 5개입니다.

그리고 grep:

grep -E '^[^,]*,[[:blank:]]*[^[:blank:],][^,]{3}[^[:blank:],][[:blank:]]*(,|$)'

그러나 주의할 점 [^,]은 및 [^[:blank:],], 일치요소 구성, 로케일에 따라 반드시 단일 문자일 필요는 없습니다. 예를 들어 GNU 시스템의 체코어 로케일에서는 다음과 일치합니다.

Stéphane,Chazel,555-5555

Ch거기에 마무리 요소가 있기 때문입니다 . 따라서 이 두 쉼표( ) <Ch><a><z><e><l>사이에서 5개의 데이터 정렬 요소를 찾습니다 .

GNU를 사용하면 대괄호 표현식이 문자만 일치하는 PCRE 대신 grep이 옵션을 사용할 수 있습니다 .-P-E

유효한 문자를 형성하지 않는 바이트 시퀀스와 일치하지 않습니다. 파일에 기록된 문자가 현재 로케일의 문자 세트와 다른 문자 세트인 경우 문제가 발생할 수 있습니다. 예를 들어 일치하지 않습니다.

Stéphane,ABCDE,555-5555

현재 로케일이 문자 세트로 UTF-8을 사용하지만 éiso-8859-1 문자 세트(0xe9 바이트)로 작성된 경우 é일치하지 않습니다 [^,](잘못된 바이트 시퀀스이므로이외의 요소를 대조합니다.,).

또한 UTF-8 로케일에서는 일부 문자소가 두 개 이상의 문자로 표시될 수 있습니다. 예를 들어, é위의 내용은 U+00E9 문자 또는 U+0065 문자( e) 뒤에 U+0301(악센트 결합)로 표시될 수 있습니다.

문자소/글리프를 일치시키려면 -P다시 and \X연산자를 사용하여 문자소 클러스터를 일치시킬 수 있습니다.

grep -P '^[^,]*,\h*(?![\h,])\X((?!,)\X){3}(?![\h,])\X\h*(,|$)'

답변2

\s 및 \S 태그와 함께 "egrep"을 사용하십시오.

egrep '^[^,]*,\s*\S{5},' file
  • 첫 번째 쉼표를 포함하여 첫 번째 필드를 건너뛰고,
  • 첫 번째 쉼표 뒤의 공백을 건너뛰고,
  • 그런 다음 5개의 문자와 일치하고 그 뒤에 선택적 공백과 쉼표가 옵니다.

답변3

다음 3가지 도구를 결합할 수 있습니다.

cut -d "," -f2 file | tr -d " " | grep -E "^.{5}$"

관련 정보