이름, 성, 전화번호. 다음은 텍스트입니다.
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}$"