使用Bash & Regex替换文件中的逗号

mo49yndu  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(99)

我需要替换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;

小数点分隔符有一个混合,既使用','又使用'.'。
我想用".“替换”,“,但只适用于十进制值,而不是像注解这样的文本。
我用regex试过sed

sed -i '/;[0-9]\+,[0-9]\+;/s/,/./g' file.csv

但那取代了所有的逗号。我不知道如何只替换我想要的东西。
我只想在bash中这样做。

n9vozmp4

n9vozmp41#

一个使用扩展正则表达式和捕获组的sed想法:

sed -E 's/([0-9]),([0-9])/\1.\2/g' file.csv

其中:

  • -E-启用扩展正则表达式支持
  • ([0-9]),([0-9])-匹配单个数字+,+单个数字
  • ([0-9])-定义一个捕获组(本例中有2个捕获组)
  • \1.\2-打印捕获组#1 + .+捕获组#2

这产生:

value;x;y;comment;
abc;123.45;987.65;abc;
abc;123.45;987.65;abc;
abc;123.45;987.65;abc, blabla;
  • 一旦满足OP,代码执行所需的操作,则可以添加-i标志,使sed执行文件的就地更新
  • 这将错误地替换字符串中的逗号,例如;3,2,4 five 6,7 eight ;(这可以解决,但需要更复杂的正则表达式)
bvjveswy

bvjveswy2#

您可以使用更简单的sed

sed -i.bak -E 's/([0-9]),([0-9])/\1.\2/g' file

value;x;y;comment;
abc;123.45;987.65;abc;
abc;123.45;987.65;abc;
abc;123.45;987.65;abc, blabla;

详细信息:

  • ([0-9]),([0-9]):匹配一个数字,后跟一个逗号,再后跟一个数字。在捕获组#1和#2中捕获前后数字
  • \1.\2:替换为反向引用#1,然后是点,然后是反向引用#2
    或者,您可以使用这个更强大的awk解决方案:
awk 'BEGIN {FS=OFS=";"} {for (i=1; i<=NF; ++i) 
if ($i ~ /^[0-9]+,[0-9]+$/) sub(/,/, ".", $i)} 1' file

value;x;y;comment;
abc;123.45;987.65;abc;
abc;123.45;987.65;abc;
abc;123.45;987.65;abc, blabla;
lh80um4z

lh80um4z3#

您可以尝试:

sed -i 's/;\([0-9]\+\),\([0-9]\+\)/;\1.\2/g' file.csv

注意:如果您使用-i选项,请不要忘记备份原始数据,以防万一。

相关问题