簡體   English   中英

想用 Bash & Regex 替換文件中的逗號

[英]Want to use Bash & Regex to replace comma in file

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

小數點分隔符混合使用,“,”和“。” 被使用。

我想用 '.' 替換 ',' 但僅適用於十進制值,不適用於評論之類的文本。

我用正則表達式嘗試了 sed

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

但這會替換所有逗號。 我找不到如何只替換我想要的東西。

我只想在 bash 中這樣做。

一個使用擴展正則表達式和捕獲組的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; (這可以解決,但需要更復雜的正則表達式)

您可以使用這個更簡單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;

你可以試試:

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

注意:如果您使用-i選項,請不要忘記備份原始數據,以防萬一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM