我有以下.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'