【发布时间】:2021-04-12 14:41:04
【问题描述】:
我需要替换 csv 文件中的特定字符,例如逗号。
我的文件包含用“;”分隔的文本和数字(csv 为法语...)
例子:
value;x;y;comment;
abc;123,45;987,65;abc;
abc;123.45;987.65;abc;
abc;123,45;987,65;abc, blabla;
小数点分隔符 ',' 和 '.' 混合使用被使用了。
我想将 ',' 替换为 '.'但仅适用于十进制值,不适用于 cmets 之类的文本。
我用正则表达式尝试了 sed
sed -i '/;[0-9]\+,[0-9]\+;/s/,/./g' file.csv
但是那替换所有逗号。我找不到如何只替换我想要的。
我只想在 bash 中这样做。
【问题讨论】:
-
使用适当的 CSV 解析器会更简单,在许多其他语言的标准库中都可以使用。您还应该将替换限制为已知包含数字数据的字段,而不是所有字段。如果您没有合适的 CSV 解析器,至少使用
awk,它可以比sed更轻松地处理单个字段。 -
为什么要专门使用正则表达式?如果您使用像
sed这样的工具,那不再是“仅 bash”,因为/bin/sed是一个完全独立的可执行文件。 bash 具有内置的字符串操作工具,您不需要外部命令;这些通常基于 fnmatch 样式匹配而不是正则表达式,但这并不意味着它们不适合用例。
标签: regex linux bash csv replace