Eu tenho um arquivo csv como este:
03139; 5; IT1234978208; 20150930 ; CTZ 13/31.12.15;
03137; 6; IT1234978206; 20151015 ; CTZ 13/31.11.18;
....
....
03134; 8; IT1234974406; 20151212 ; CTZ 13/37.13.17;
Estou procurando uma solução alternativa para remover todos os espaços em branco de todas as linhas csv usando sed
o comando no Korn Shell para obter algo assim:
03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;
Alguém me poderia ajudar por favor?
Responder1
Parece que você deseja remover apenas os espaços que estão antes ou depois do ponto e vírgula. Nesse caso:
$ sed 's/[[:space:]]*;[[:space:]]*/;/g' text
03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;
Como funciona:
O comando de substituição sed normalmente se parece com s/old/new/
onde old
está uma expressão regular. Neste caso, adicionamos um g
sufixo para indicarglobalsubstituição (em vez de apenas substituir uma instância). No nosso caso, old
corresponde a qualquer a ;
e a qualquer espaço em branco circundante: s/[[:space:]]*;[[:space:]]*
. Isso é substituído por new
which é apenas um arquivo ;
.
Responder2
Eu atenderia perl
, porque então você pode split
e join
:
#!/usr/bin/env perl
use strict;
use warnings;
while ( <DATA> ) {
chomp;
my @fields = split /;/;
s/\s+//g for @fields;
print join ";", @fields, "\n";
}
__DATA__
03139; 5; IT1234978208; 20150930 ; CTZ 13/31.12.15;
03137; 6; IT1234978206; 20151015 ; CTZ 13/31.11.18;
03134; 8; IT1234974406; 20151212 ; CTZ 13/37.13.17;
Agora, isso retira todos os espaços nos campos, dando:
03139;5;IT1234978208;20150930;CTZ13/31.12.15;
03137;6;IT1234978206;20151015;CTZ13/31.11.18;
03134;8;IT1234974406;20151212;CTZ13/37.13.17;
Mas se você quiser apenas remover o espaço inicial/final:
s/^\s+|\s+$//g para @fields;
Isso pode ser feito em uma linha como:
perl -F; -lape 's/^\s+|\s+$//g for @F; print join ";", @F;'
Onde:
-F;
define delimitador-l
diz remover/adicionar novamente terminações de linha automaticamente.-a
é divisão automática (no delimitador-F
ou espaço em branco por padrão)-e
é "executar este trecho".