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

标签 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 

如果差异太细微而无法注意到:

我需要编写一个脚本,在该文件夹中的每个文件的每一行中将每第三个和第五个分号更改为一个句点。

我的研究表明我必须在脚本中设计一些巧妙的 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/

相关文章:

regex - 在 linux 中的正则表达式后将文本附加到文件

awk - bash/grep : getting multiple matching elements from a json

shell - 仅当该部分中的一行包含其中的某个字符串时,如何在两个正则表达式之间打印该文件部分

bash - 代码不适用于 sh -c,但直接适用于 sh

bash - curl:参数列表太长

linux - 删除空字符(Shell 脚本)

c# - 如何找到 ","之前的单词?

regex - url 中的正则表达式。 Django 2.0 中的 py

regex - 通过正则表达式修剪 URL,但不修改为 root

mysql - REGEXP "and"运算符