[英]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;
注意事項:
-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.