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.