Sed excluir linha se o caractere n-é não caractere específico

2

Eu tenho um arquivo csv e quero excluir linhas se o 12º caractere não for ; .

Então, por exemplo, meu arquivo é assim:

2266308;A;B;dfsgsfdg    
2266309;A;BJHSADFK;gfsdg
2266310;A;B;dfg

e eu quero:

2266308;A;B;dfsgsfdg
2266310;A;B;dfg

Como posso remover uma linha se o 12º caractere não for ; com sed? =)

    
por Konstantin 17.03.2016 / 14:07

1 resposta

3

Para excluir todas as linhas cujo 12º caractere não é ; , você pode fazer:

 $ sed -E '/^.{11}[^;]/d' file
2266308;A;B;dfsgsfdg    
2266310;A;B;dfg

Ou para editar o arquivo original (se o seu sed for compatível com -i ):

$ sed -iE '/^.{11}[^;]/d' file

E se o seu sed não for compatível com -E :

sed -i '/^.\{11\}[^;]/d' file

No entanto, como esse é um arquivo csv, é muito mais seguro usar campos em vez de contagens de caracteres. Por exemplo, use awk e diga para imprimir todas as linhas cujo terceiro campo tenha um caractere:

$ awk -F';' 'length($3)==1' file
2266308;A;B;dfsgsfdg    
2266310;A;B;dfg

Com o GNU awk recente, você pode editar o arquivo:

 awk -iinplace -F';' 'length($3)==1' file

Isso tem a vantagem de ser robusto para alterações nos comprimentos dos campos anteriores. Ao contrário da abordagem sed , ela não falhará se você tiver espaço em branco na linha ou se qualquer um dos primeiros 2 campos forem mais longos (ou mais curtos) do que o esperado. Como regra geral, se seus dados forem separados por campos, usar os campos é uma ideia melhor do que usar posições de caracteres.

    
por 17.03.2016 / 14:29