이 정규식을 sed 친화적으로 변환하세요.

이 정규식을 sed 친화적으로 변환하세요.

sed를 사용하여 이 정규식을 실행하려고 하는데 sed가 이를 지원하지 않는 것 같나요? 잘못된 문자 범위라고 뜹니다

echo "$info" | sed -e 's/(?:\d[\s-.]*){12,19}/*/g'

공백에 관계없이 12에서 19 사이의 숫자를 일치시키십시오. - 또는. 수치

sed: 1: "s/(?:\d[\s-.]*){12,19}/ ...": RE error: invalid character range

대시를 문자 범위 내에서 위로 이동하면 문제가 해결된 것 같지만 (?:\d[-\s.]*){12,19}아무것도 수행되지 않습니다. 이것이 일치하지 않는다는 의미입니까? 하지만 정규 표현식 테스트 케이스에서는 그렇지 않다고 말합니다.

예:

A0000000000000000D
1234 1234 1234 1234
VISA 1234123412341234 EXP 1222 CVV 123

답변1

정규식의 다음 부분이 오류의 원인입니다.[\s-.]

-대괄호 표현식에서 다른 문자로 처리 하려면시작또는표현. 그렇지 않으면 범위로 처리됩니다.

예를 들어:

  • [a-z]"a부터 z까지의 모든 소문자 일치"를 의미합니다.
  • [-az]또는 [az-]"대시, 'a' 또는 'z' 일치"를 의미합니다.

그건 그렇고, 내가 아는 sed 버전은 perl-ish를 or \d의 동의어로 이해하지 못합니다 . 일부 버전 (예: GNU sed)에서는 이를 공백과 탭( )의 동의어로 이해하지만 전부는 아닙니다. 그리고 그것들[0-9][:digit:]sed\s[:blank:]하다이해해 \s, 아마 그냥 이해해외부대괄호 표현식(이것의 내부를 이해하는 사람은 없지만, []그렇다고 해서 이를 이해하는 모호한 sed 변형이 없다는 의미는 아닙니다).

또한, 내가 아는 한, sed는 (?:)하위 표현식을 캡처하지 않음으로써 Perl이 무엇을 의미하는지 이해하지 못합니다.

\{{}와 같은 확장 정규 표현식(ERE) 기능을 및 로 이스케이프하지 않고 사용하려면 \}sed 옵션을 사용해야 합니다 -E(이스케이프는 { }와 같은 GNU 확장일 수 있으므로 \+모든 버전의 sed에서 작동하지 않을 수 있음).

12~19자리 숫자 일치가능한공백이나 대시를 포함하고 이를 별표로 바꾸는 경우 먼저 공백과 대시를 제거한 다음 12~19자리 숫자를 일치시켜야 합니다. 예를 들어

echo "$info" | sed -E -e 's/[[:blank:]-]//; s/[[:digit:]]{12,19}/*/g'

참고: 이식성에 관심이 없고 sed의 오래된 버전이나 독점 버전을 다룰 가능성이 전혀 없는 경우에는 괜찮습니다. 그렇지 않으면 BRE(Basic Regular Expressions)를 사용하거나 대신 perl -nor를 사용하십시오 (Perl의 정규식 방언을 사용하려면 반드시 Perl을 사용하십시오).perl -psed

또한 이는 의 모든 항목에 영향을 미치므로 $info모든 공백과 대시가 제거됩니다. $info의 내용에 따라 원하는 내용이 아닐 수도 있습니다.

VISA 1234123412341234 EXP 1222 CVV 123$info에 다른 텍스트(예: 가 아닌 ) 가 포함될 수 있는 경우 1234123412341234전체 줄 대신 각 개별 필드를 쉽게 처리할 수 있도록 sed 대신 awk 또는 perl을 사용해야 합니다.

관련 정보