Bash脚本 - 批量修改文件sed正则表达式

时间:2012-09-09 00:06:09

标签: regex bash sed

我有一组.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。

2 个答案:

答案 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的某些细节并非完全可移植。我不认为上面有任何不便携的内容,所以应该没问题,但请备份首先复制你的文件夹,然后再运行上面的文件。以防万一。)