2014-10-10 66 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