Com uma mistura de variáveis de shell, podemos fazer isso no GNU sed
como mostrado:
nF='[^,]*'; # a normal unquoted csv field
qF='"[^"]*"'; # a quoted csv field
F="\($qF\|$nF\)"; # a csv field
ok="$F,$F,$F\$"; # a csv record with exactly 3 fields
# ok="\($F,\)\{2\}$F\$"; # an equivalent way to write out the regex for an ok csv record
sed -e "
:a;/$ok/b
N;s/\n//;ba
" input.csv
saídas
ABCD,1234,QWER
ASDF,2345,VGFT
"ASDF,12",1212,ASDR
1234,ZXCV,ERTT
funciona como
- Construa a gramática de um csv usando uma mistura de variáveis de shell a serem usadas no sed.
- Supondo que um registro csv não tenha mais de 3 campos.
- Primeiro verifique se o registro csv está ok, ou seja, ele tem exatamente 3 campos. Nesse caso, basta imprimir o registro e ler o próximo registro.
- OTW, ou seja, menos de 3 campos foram encontrados no registro csv atual, anexamos a próxima linha por meio do comando
N
, removemos o conector, um\n
e, com esse espaço de padrão modificado, ramificar para o topo do código sed.