5

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

4

2 回答 2

4

这是一个非常简短的方法:

sed 's/;/./3;s/;/./4' -iBAK *

它用 替换了第 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-i.


这个脚本可能不是完全可移植的,但我已经在带有 BSD sed(不知道什么版本)的 Mac 10.8 和带有 sed (gsed) 4.1.4 (2003) 的 Linux 上对其进行了测试。@JonathanLeffler 指出它sed是 2008 年的标准 POSIX。我也刚刚找到它并且非常喜欢它。


高尔夫提示:如果从 bash 运行命令,则可以使用大括号扩展来实现极短的版本:

sed -es/\;/./{3,4} -i *
于 2012-09-09T00:16:35.767 回答
1

这是一种方法:

sed -i 's/^\([^;]*;[^;]*;[^;]*\);\([^;]*;[^;]*\);/\1.\2./' foldername/*

(免责声明:我确实对此进行了测试,但其中的一些细节sed并不完全可移植。我认为上面没有任何不可移植的东西,所以应该没问题,但请先备份您的文件夹,然后再运行以上。以防万一。)

于 2012-09-09T00:10:54.433 回答