2014-10-10 37 views
0

为什么我的正则表达式不工作?它只是返回原始文件。我的文件看起来像这样(几百行):足球数据正则表达式

1 Germany 1765 0 Equal 
2 Argentina 1631 0 Equal 
3 Colombia 1488 1 Up 
4 Netherlands 1456 -1 Down  
5 Belgium 1444 0 Equal 
6 Brazil 1291 1 Up 
7 Uruguay 1243 -1 Down  
8 Spain 1228 -1 Down  
9 France 1202 1 Up 
... 
192 US Virgin Islands 28 -1 Down  

而且我想这样的:

Germany,1 
Argentina,2 
Colombia,3 
... 
US Virgin Islands,192 

这是我试过的正则表达式:

sed 's/\([0-9]*\)\t\([a-zA-Z]*\)/\2,\1/g' <fifa.csv >fifa.csv 

,但它只是回报原始文件。 编辑: 现在我试图

sed 's/\([0-9]*\)\t\([a-zA-Z]*\)/\2,\1/g' <fifa.csv >fifa.csv 

,并得到

,1 Germany,,1765Equal,0, 
,2 Argentina,,1631Equal,0, 
,3 Colombia,,1488Up,1, 
,4 Netherlands,,1456-Down,1, 
,5 Belgium,,1444Equal,0, 
+1

什么让你觉得字母'tab'将匹配输入一个制表符?你可能需要使用一个转义序列 - '\ t'是我的猜测。 – IMSoP 2014-10-10 00:09:49

+0

输入是否是制表符分隔的? – 2014-10-10 00:14:32

+0

@AvinashRaj是的,它是一个单词或数字后跟一个制表符。 – 2014-10-10 00:15:44

回答

1

你可以试试下面的sed命令,如果字段制表符分隔。

sed 's/^\([0-9]\+\)\t\([^\t]*\).*/\2,\1/' file 

添加直列编辑选项-i保存所做的更改。

sed -i 's/^\([0-9]\+\)\t\([^\t]*\).*/\2,\1/' file 

^表示行锚的开始。 +会重复前一个字符一次或多次。基本的sed使用BRE,因此您需要转义+以执行重复前一个字符一次或多次的功能。 [^\t]*匹配任何字符,但不匹配\t制表符零或多次。

+0

最后不应该添加/ g'吗? – 2014-10-10 00:22:43

+0

不,每次更换只发生一次。所以我们不需要去'g'修饰符。 – 2014-10-10 00:23:31

+0

还有^和+和^ \ t和。*是什么意思?你能解释一下这个正则表达式吗? – 2014-10-10 00:23:56

1

以下是您在找的内容。 -i选项指定要在原地编辑文件。

sed -i 's/^\([0-9]\+\)\t\([^\t]*\).*/\2,\1/' fifa.csv 
0
awk '{print($2 "," $1)}' YourFile 

不是一个sed,但更容易管理

+1

Won不适用于包含空格的国家名称,如“美属维尔京群岛”。 – ebohlman 2014-10-14 08:19:37

+0

对,忘记这一点,它在样本中,对不起。 – NeronLeVelu 2014-10-14 08:54:42

+0

所以另一个sed'sed's/[0-9] * * \([^ 0-9] * \)。*/\ 1,&/ s/* \(,[0-9] * \) 。*/\ 1 /'YourFile' – NeronLeVelu 2014-10-14 09:03:34