파일의 주소 필드에 대한 유효성 검사를 구축하려고 합니다.
파일은 다음과 같습니다.
123 Strata Ln.
15 138th Ave
27 Hilltop Dr. Apt. 7
F52 Milk Ln.
156A Fantastic St.
56 sample Ln.
조건은 다음과 같습니다.
숫자 - 최소 한 자리 이상, 그 뒤에 추가 숫자가 옵니다.
거리 이름 - 대문자 또는 숫자로 시작하고 그 뒤에 소문자 및 대문자, 숫자 또는 마침표(.)가 이어지는 임의 개수의 단어(최소 1개)
편집: 이러한 조건에서는 파일의 처음 세 줄만 유효합니다.
내가 시도한 것은 다음과 같습니다.
'^[[:digit:]][[:digit:]]+ ([[:upper:]]|[[:digit:]])([[:alphabet:]]|[[:digit:]])+\.$'
하지만 작동하지 않는 것 같습니다. 도움이 필요하세요?
답변1
최소한 하나의 숫자, 그 뒤에 임의의 숫자의 추가 숫자가 옵니다.
+
이미 "하나 이상"이므로 [[:digit:]][[:digit:]]+
적어도 2개가 필요합니다. 그래서 [[:digit:]]+
.
각각 대문자 또는 숫자로 시작하고 그 뒤에 임의 개수의 소문자 및 대문자, 숫자 또는 마침표(.)가 오는 단어(최소 하나)
대문자 또는 숫자: 괄호 안에 두 문자 클래스를 모두 사용할 수 있으므로 여기서는 [[:upper:][:digit:]]
( )를 번갈아 사용할 필요가 없습니다 .|
[[:alphabet:]]
유효한 문자 클래스는 아니지만 alpha
and alnum
(문자 또는 숫자용)가 있습니다. 후자가 유용할 수 있습니다.
한 문장으로:[[:upper:][:digit:]][[:alnum:].]*
각 단어 앞에 공백이 있는 여러 단어(앞 숫자 뒤의 공백도 처리 가능):([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+
전체 줄을 일치시키려면 끝에 ^
and 를 추가하거나 를 사용하십시오. 실수로 쉽게 남을 수 있는 후행 공백을 허용하려면 끝(앞)에 추가해야 할 수도 있습니다 .$
grep -x
[[:blank:]]*
$
그러면 예제 입력의 처음 세 줄만 인쇄됩니다.
grep -E '^[[:digit:]]+([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+$' file
정규식을 사용하기 위한 온라인 도구가 있습니다.https://regex101.com/
이는 테스트에 유용할 수 있습니다. 위의 요구 사항은 (대안이 추악하기 grep -E
때문 )이지만 regex101이 간단한 기본 정규 표현식을 +
허용하지 않는다고 생각합니다 .grep