我有一组 .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
如果差异太细微而无法注意到:
我需要编写一个脚本,在该文件夹中的每个文件的每一行中将每第三个和第五个分号更改为一个句点。
我的研究表明我必须在脚本中设计一些巧妙的 sed s/
命令。问题是我不太擅长正则表达式。通过阅读本教程,它可能会涉及/3 和/5。
最佳答案
这是一个非常简短的方法:
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
.
此脚本可能不是完全可移植的,但我已经在 Mac 10.8 上使用 BSD sed(不知道是什么版本)和 Linux 上使用 sed (gsed) 4.1.4 (2003) 对其进行了测试。 @JonathanLeffler 指出这是标准的 POSIX sed
截至 2008 年。我也刚刚找到它并且非常喜欢它。
Golf 提示:如果您从 bash 运行命令,您可以使用大括号扩展来实现超短版本:
sed -es/\;/./{3,4} -i *
关于regex - Bash脚本——批量修改文件sed正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335481/