Ter um arquivo CSV como este:
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
e procurando resultados como:
HEADER
first, column|second "some random quotes" column|third ol' column
por outras palavras, remover "FOOTER", aspas no início, fim e à volta |.
Até agora, esse código funciona:
sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe
Como você vê, o problema é que ele cria 4 arquivos extras.
Aqui está outra solução, que tem como objetivo não criar arquivos extras e fazer a mesma coisa em um único script. Não funciona muito bem.
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
sed
não vai trabalhar com isso, apenas com CSV simplificado. Use uma linguagem de programação com uma biblioteca que possa lidar com arquivos CSV reais (Python / Perl / Ruby).Respostas:
Antes de tudo, como Michael mostrou, você pode simplesmente combinar tudo isso em um único comando:
Eu acho que algumas
sed
implementações não conseguem lidar com isso e podem precisar de:Dito isso, parece que seus campos são definidos
|
e você deseja apenas remover"
todo o campo, deixando aqueles que estão dentro do campo. Nesse caso, você pode fazer:Ou, com o GNU
sed
:Você também pode usar o Perl:
fonte
Isso também funcionaria:
sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'
Exemplo:
versão bonita
fonte
FOOTER
, ele removerá os dados desejados.