首页 > 解决方案 > Unix:查找连续逗号并将其替换为连续管道

问题描述

我正在将双引号 CSV 转换为 Unix 中管道分隔的 txt 文件。我已使用以下 sed 命令将“,”替换为 | 然后删除开始和结束双引号。

sed -e 's/","/|/g' -e 's/"//g' filenm.csv > filenm.txt

但是该文件似乎有没有双引号的连续逗号,并且它们没有被替换。

Col1|col2|col3|col4|col5|col6|col7|col8
Val1|val2|val3,,,,val7|val8

现在我想将所有这些连续的逗号转换为连续的管道,因为它们表示空字段或空字段。

其他字段在字段值内也有不应更改的逗号。

我尝试在下面使用,但没有工作。

sed -e 's/,{1,\}/|{1,\}/g' filenm.csv > filenm.txt

在记事本中打开的示例 csv 文件:

"ID","Name","DOB","Age","Address","City","State","Country","Phone number"
"123","ABC","12/20/2020","15","No.38,3rd st, RRR NNN, TRT",,,,"9999999999"
"456","DEF","12/20/2020",,,,,"test-country","9999999999"
"465","XYZ",,,"No.38,3rd st, RRR NNN, TRT",,,,"9999999999"

我希望这有助于重现问题并解决。

提前致谢....

标签: regexlinuxunixawksed

解决方案


这可能对您有用(GNU sed):

sed -E ':a;s/^(("[^",]*",+)*"[^",]*),/\1\n/;ta;y/,\n/|,/' file

用换行符迭代替换,'s between "'s,然后将,'s 翻译为|'s,将换行符翻译为,'s。


推荐阅读