2012-07-07 33 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/' 

谢谢!