sed: 역방향 패턴 대체

sed: 역방향 패턴 대체

다음 파일이 있습니다 .txt.

ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-4321
(682) 543-7890

명령을 사용하여 우편번호 마지막 4자리를 역으로 변경해야 합니다 sed. 출력 예:

ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890

우편번호 앞에 텍스트가 있고 그 사이에 대시가 있는 세 번째 줄입니다. 따라서 세 번째 줄의 대시 이후의 모든 것입니다. 우편번호가 완전히 독립된 경우에만 이 작업을 수행할 수 있습니다. 나는 시도했다:

sed -i -e 's/([0-9])([0-9])([0-9])([0-9])([0-9])-([0-9])([0-9])([0-9])([0-9])/\9\8\7\6/' test.txt

하지만 이렇게 하면 되돌린 후 다른 모든 항목이 삭제됩니다.

답변1

먼저 해당 줄에 고유한 일부 패턴을 찾아 명령을 단순화할 수 있습니다. 아래 예에서는 세미콜론이 ;구문 분석되는 줄에 고유하다고 가정합니다(적어도 예 텍스트에서는) sed.

# capture the last 4 digits of the line and substitute them in reverse order
$ sed '/;/s/\(.\)\(.\)\(.\)\(.\)$/\4\3\2\1/'
ABC Corp
1234 7 Oaks Lane 
Denton; TX 76509-1234
(682) 543-7890

답변2

~처럼또 다른 대답, 그러나 Perl을 사용하는 경우:

$ perl -lp -e '/;/ && s/(?<=-)\d{4}/reverse $&/e' <file
ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890

문자가 포함된 줄을 찾아 ;해당 줄의 대시 뒤에 있는 4자리 숫자를 반대로 바꿉니다.

숫자 반전은 reversePerl 함수를 사용하여 수행됩니다.

답변3

또 다른 sed옵션에는 임의 길이의 숫자를 바꿀 수 있는 유연성도 있습니다.

sed -E ':a 3s/-([0-9]+)([0-9])$/-\2-\1/; ta;
        :b 3s/-([0-9])-([0-9]+)$/-\1\2/; tb'

관련 정보