"|"로 구분된 일부 옵션을 테스트해 보세요.

"|"로 구분된 일부 옵션을 테스트해 보세요.

여러 옵션으로 구성된 문자열이 있습니다. 값은 |로 구분됩니다.

옵션: 값은 다음 두 가지 중 하나일 수 있습니다.

[[: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"일치하지 않으면 인쇄")과 일치하지 않는 줄을 인쇄합니다.

관련 정보