2014-10-18 44 views
1

如何使用RegEx来匹配Unix sed命令中特定字符之前或之后的整数?如何使用RegEx匹配Unix sed命令中特定字符之前或之后的整数?

假设我们有一个sed号码文件:

cat sed-numbers 
(1, 2) 
(4, 5) 
(2, 3) 

现在我可以用sed来切换(x, y)(y, x),但我不知道如何选择,而不选择字符(的第一个整数,所以,我必须在模式\2前加上一个(角色来完成任务:

sed 's/^(\([0-9]*\), \([0-9]*\)/(\2, \1/' sed-numbers 
(2, 1) 
(5, 4) 
(3, 2) 

有没有我可以做开关,而不在我SWIT添加(任何方法ch模式?换句话说,我可以使用RegEx来选择第一个整数,它必须在(之后,而不是选择(+integer

其他问题: 如果我们只需要切换的位置,如果第一个数字是整数,数据格式是:

(11, 2) 
(0.2, 5) 
(2.1, 3) 
(4, 2.1) 

回答

0

如果输入的是在你的问题中提到那么确切格式你可以使用下面的sed commnad,

$ sed 's/\([0-9]*\), \([0-9]*\)/\2, \1/' file 
(2, 1) 
(5, 4) 
(3, 2) 

您使用回顾后和预读能做到这一点通过简单的Perl,

$ perl -pe 's/(?<=\()(\d+), (\d+)(?=\))/\2, \1/g' file 
(2, 1) 
(5, 4) 
(3, 2) 

更新

这样的工作你更新的问题。

$ perl -pe 's/(?<=\()(\d+), (\d+(?:\.\d+)?)(?=\))/\2, \1/g' file 
(2, 11) 
(0.2, 5) 
(2.1, 3) 
(2.1, 4) 
+0

如果什么数据格式为(11,2) (0.2,5) (2.1,3) (4,2.1)?如果第一个数字是整数,我们只能切换位置。 – Yong 2014-10-18 18:05:36

+0

你能否根据上述评论更新你的问题?你想要perl解决方案吗? – 2014-10-18 18:10:25

+0

感谢您的真棒解决方案!除了perl,有可能解决额外的问题,只能使用sed?顺便说一句,我尝试了你的Perl解决方案的额外问题。它不适用于(4,2.1),4是一个整数,但它没有切换位置。 – Yong 2014-10-19 16:41:37

相关问题