Как рекомендуют ребята, лучше и безопаснее читать csv как csv с соответствующим модулем / библиотекой.
В любом случае, если вы хотите посидеть здесь, это:
sed -i 's/|//g;y/,/|/;:r;s/\("[^"]*\)|\([^"]*"\)/\1,\2/g;tr' file.csv
Процедура:
- Во-первых, он удаляет все каналы из CSV, чтобы не повредить CSV.
- Во-вторых, он преобразует все запятые в каналы
- В-третьих, он "рекурсивно" восстанавливает все каналы, указанные в кавычках, в запятые.
Тест:
$ cat file.csv
aaa,1,"what's up"
bbb,2,"this is pipe | in text"
ccc,3,"here is comma, in text"
ddd,4, ",, here a,r,e multi, commas,, ,,"
"e,e",5,first column
$ cat file.csv | sed 's/|//g;y/,/|/;:r;s/\("[^"]*\)|\([^"]*"\)/\1,\2/g;tr'
aaa|1|"what's up"
bbb|2|"this is pipe in text"
ccc|3|"here is comma, in text"
ddd|4| ",, here a,r,e multi, commas,, ,,"
"e,e"|5|first column
$ cat file.csv | sed 's/|//g;y/,/|/;:r;s/\("[^"]*\)|\([^"]*"\)/\1,\2/g;tr' | awk -F'|' '{ print NF }'
3
3
3
3
3