2012-07-07 62 views
0

我有記錄這樣一個CSV文件:正則表達式替換記錄最後n個分隔符

^Tablete Internet^|GoClever|^TAB I71^|^Tableta GoClever TAB I71, InfoTMIC iMAPx220 1GHz MKV, MOV, VOB, DAT, WMV, AVI, 3GP, MP4, RM, RMVB, FLV, MKV, MOV, VOB, DAT, WMV, MP3!WAV!OGG!FLAC!APE!AAC, Conectori: 1x mini jack 3.5 mm, 2 porturi USB 2.0, 4000 mAh lithium-ion polymer 3.7V^!92.00!USD!w!24!0!Link!!^5 ron^!!| 
Group|Prod|Den|Description!12!EUR!^wait time^!160!Modified!Link!^Spec Obs^!^tv none^!more!info| 

我需要更換近10的「!」從「|」行的末尾開始所以finaly它看起來像:

^Tablete Internet^|GoClever|^TAB I71^|^Tableta GoClever TAB I71, InfoTMIC iMAPx220 1GHz MKV, MOV, VOB, DAT, WMV, AVI, 3GP, MP4, RM, RMVB, FLV, MKV, MOV, VOB, DAT, WMV, MP3!WAV!OGG!FLAC!APE!AAC, Conectori: 1x mini jack 3.5 mm, 2 porturi USB 2.0, 4000 mAh lithium-ion polymer 3.7V^|92.00|USD|w|24|0|Link||^5 ron^||| 
Group|Prod|Den|Description|12|EUR|^wait time^|160|Modified|Link|^Spec Obs^|^tv none^|other|info| 

我已經試過:

sed 's/!\([^\^!]*\)!\([^!]*\)$/|\1|\2/' 

但這僅替換最後2個出現次數的 「!」。如果我嘗試

sed 's/!\([^\^!]*\)!\([^!]*\)!\([^!]*\)$/|\1|\2\3/' 

它不匹配任何東西......所以我該如何做到這一點?

謝謝!

+0

你真的需要使用正則表達式嗎?編寫解析輸入文件並生成輸出文件的腳本可能更容易。 – 2012-07-07 12:04:13

+0

我正在寫一個腳本...它正在從excel xls轉換爲csv,我需要解析不良的結果csv,因此我可以選擇性地將一些數據導入到mysql數據庫中。我需要使用bash工具和一些perl來完成所有這些。 – user1508564 2012-07-07 14:29:45

回答

0

我知道是不是最完美的解決方案,但我已經成功做到這一點的:

perl -npe 's/^(.*)!(.*)!(.*)!(.*)!(.*)!(.*)!(.*)!(.*)!(.*)!(.*)!(.*)$/$1|$2|$3|$4|$5|$6|$7|$8|$9|$10|$11/' 

謝謝!