![이 정규식을 sed 내에서 친숙하게 변환하세요.](https://rvso.com/image/192221/%EC%9D%B4%20%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84%20sed%20%EB%82%B4%EC%97%90%EC%84%9C%20%EC%B9%9C%EC%88%99%ED%95%98%EA%B2%8C%20%EB%B3%80%ED%99%98%ED%95%98%EC%84%B8%EC%9A%94..png)
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 -p
sed
또한 이는 에 있는 내용 전체에 영향을 미치므로 $info
모든 공백과 대시가 제거됩니다. $info의 내용에 따라 원하는 내용이 아닐 수도 있습니다.
VISA 1234123412341234 EXP 1222 CVV 123
$info에 다른 텍스트(예: 그냥 대신 ) 가 포함될 가능성이 있는 경우 1234123412341234
sed 대신 awk 또는 perl을 사용해야 전체 행이 아닌 각 개별 필드로 쉽게 작업할 수 있습니다.