이 정규식을 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 변형이 없다는 것을 의미하지는 않습니다).

그리고 AFAIK, 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)을 따르거나 대신에 perl -n또는를 사용하십시오 (그리고 Perl의 정규 표현식 방언을 사용하려면 반드시 Perl을 사용하십시오).perl -psed

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

VISA 1234123412341234 EXP 1222 CVV 123$info에 다른 텍스트(예: 그냥 대신 ) 가 포함될 가능성이 있는 경우 1234123412341234sed 대신 awk 또는 perl을 사용해야 전체 행이 아닌 각 개별 필드로 쉽게 작업할 수 있습니다.

관련 정보