다음 파일이 있습니다 .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자리 숫자를 반대로 바꿉니다.
숫자 반전은 reverse
Perl 함수를 사용하여 수행됩니다.
답변3
또 다른 sed
옵션에는 임의 길이의 숫자를 바꿀 수 있는 유연성도 있습니다.
sed -E ':a 3s/-([0-9]+)([0-9])$/-\2-\1/; ta;
:b 3s/-([0-9])-([0-9]+)$/-\1\2/; tb'