모든 사회 보장 번호 시퀀스의 모든 숫자를 변경하는 sed 명령을 원합니다(형식은 다음과 같습니다).123-45-6789아니면 이거123456789) X로. 형식이 제공된 두 가지 예 중 하나와 정확히 동일하지 않은 일련의 숫자는 sed
이 명령의 영향을 받지 않습니다. 숫자 순서가 모두 하나로 통합되어 있습니다.정보.txt문서.
정보.txt대략 다음과 같습니다.
id093: 888-88-8888
id094: 333-33-3333
id095: 123456789
id096: 987654321
This next number shouldn't be converted to X's 0123456789 nor this one 0987-65-4321
(에서 이 페이지를 봅니다.http://www.computerhope.com/unix/used.htm) "s 명령"에서 다음 형식을 사용해야 한다는 것을 알고 있습니다.
sed –i 's/regularexpression(s)/replacement/g' info.txt
이전에 언급한 두 형식을 준수하는 숫자만 영향을 받도록(하이픈은 유지하면서) regular expression(s)
및 부분의 형식을 지정하는 방법을 잘 모르겠습니다 .replacement
답변1
sed
이미 GNU ( -i
확장) 를 사용하고 있는 것 같습니다 .
sed -ri ':1
s/(^|[^-0-9])[0-9]{3}-[0-9]{2}-[0-9]{4}([^-0-9]|$)/\1XXX-XX-XXXX\2/g
s/(^|[^-0-9])[0-9]{9}([^-0-9]|$)/\1XXXXXXXXX\2/g
t1' your-file
(BSD 로 sed
대체 )-ri
-Ei ''
ddddddddd
즉 , ddd-dd-dddd
앞이나 뒤에 십진수 또는 하이픈이 없는 경우 합계를 변환합니다 .
그리고 perl
( GNU에서 sed
빌려옴 -i
):
perl -pi -e 's{(?<![\d-])(\d{3}-\d\d-\d{4}|\d{9})(?![\d-])}{
$& =~ s/\d/X/gr}eg' your-file