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

这会查找包含字符的行;,并反转该行上破折号后的四位数字。

数字的反转是使用 Perlreverse函数完成的。

答案3

另一种sed选择也可以灵活地反转任意长度的数字:

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

相关内容