여러 옵션으로 구성된 문자열이 있습니다. 값은 |로 구분됩니다.
옵션: 값은 다음 두 가지 중 하나일 수 있습니다.
[[:alnum:]]{3}:all
[[:alnum:]]{3}:FQDN
여기서 FQDN은 호스트의 DNS 이름입니다.
예를 들어:
647:all|1bc:all|d1f:all|vf4:www.host.com|vk4:all|k22:www.another.com|bbd:all|opo:all
이 문자열이 규칙과 일치하는지 테스트하기 위해 정규식을 어떻게 작성할 수 있습니까?
답변1
647:all|1bc:all|d1f:all|...
문자열의 형식이 올바르고 위에서 언급한 패턴과 일치하는 부분이 포함되어 있는지 테스트하시겠습니까 ?
도메인 이름을 얼마나 엄격하게 일치시키려는지에 따라 이 중 일부는 (ERE에서) 예를 들어 다음과 같습니다.
[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+)
|
-로 구분된 여러 복사본이 포함된 완전한 줄도 있습니다 .
^[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+)(\|[[:alnum:]]{3}:(all|[-a-zA-Z0-9.]+))*$
abcd
이렇게 하면 실제로 정규화되거나 유효한 이름이 아니더라도 도메인 이름에 또는 같은 것을 사용할 수 있습니다 . foo..bar
보다 엄격한 테스트를 위해 도메인 이름 부분은 다음과 같아야 합니다.[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+\.?
하나의 큰 정규식을 사용하는 것보다 먼저 문자열을 분할하고 부분을 개별적으로 테스트하는 것이 더 나을 수 있습니다.
다음과 같은 것은 원하는 패턴과 일치하지 않는 요소를 인쇄합니다.
$ perl -lne 'chomp; for $a (split/\|/) {
print "mismatch: $a" if $a !~ /^[[:alnum:]]{3}:(all|[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+\.?)$/;
}' <<< '123:all|456:abcd|789:foo..bar|999:www.host.com'
mismatch: 456:abcd
mismatch: 789:foo..bar
답변2
다음 2단계 파이프라인은 문자열의 모든 부분을 인쇄합니다.아니요질문의 기준을 충족하세요.
tr '|' '\n'| sed -r -n '/^[[:alnum:]]{3}:[[:alnum:].]{1,}$/!p'
이는 FQDN에 대해 매우 완화된/완화된 표현을 사용합니다. 즉, , 및 , 및 의 영숫자 집합 [[:alnum:]._-]{1,}
(FQDN이 "유효함"을 의미함)입니다..
_
-
---
파이프는 문자열을 구분 기호에 따라 여러 줄로 나누고 |
, sed
표현식은 주어진 정규식( !p
"일치하지 않으면 인쇄")과 일치하지 않는 줄을 인쇄합니다.