我有一组.csv文件(全部在一个文件夹中),格式如下所示:
170;151;104;137;190;125;170;108
195;192;164;195;171;121;133;104
... (a lot more rows) ...
事情是我搞砸了一下,看起来应该是这样的
170;151;104.137;190.125;170;108
195;192;164.195;171.121;133;104
如果差异太微妙而无法注意到:
我需要编写一个脚本,将每第三个和第五个分号更改为该文件夹中efery文件中每一行的句点。
我的研究表明我必须在我的脚本中设计一些聪明的sed s/
命令。问题是我对正则表达式不是很好。从阅读教程开始,它可能会涉及/ 3和/ 5。
答案 0 :(得分:4)
这是一个非常简短的方法:
sed 's/;/./3;s/;/./4' -iBAK *
它用[{1}}替换;
的第3个然后是第5个(现在是第4个)实例。
我在你的样本上测试了它(保存为sample.txt):
.
为了安全起见,我将我的示例备份为$ sed 's/;/./3;s/;/./4' <sample.txt
170;151;104.137;190.125;170;108
195;192;164.195;171.121;133;104
。要防止这种情况发生,请将<WHATEVER>.BAK
更改为-iBAK
。
这个脚本可能不是完全可移植的,但我已经在Mac 10.8上用BSD sed(不知道什么版本)和Linux与sed(gsed)4.1.4(2003)进行了测试。 @JonathanLeffler指出它是2008年的标准POSIX -i
。我也发现了它并喜欢它。
高尔夫小贴士:如果你从bash运行命令,你可以使用大括号扩展来实现一个非常短的版本:
sed
答案 1 :(得分:1)
这是一种方式:
sed -i 's/^\([^;]*;[^;]*;[^;]*\);\([^;]*;[^;]*\);/\1.\2./' foldername/*
(免责声明:我对此进行了测试,但sed
的某些细节并非完全可移植。我不认为上面有任何不便携的内容,所以应该没问题,但请备份首先复制你的文件夹,然后再运行上面的文件。以防万一。)