Ich habe eine CSV-Datei wie diese:
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;
Ich suche nach einer Problemumgehung, um alle Leerzeichen aus allen CSV-Zeilen zu entfernen, indem ich sed
den Befehl in der Korn-Shell verwende, und habe ungefähr Folgendes erhalten:
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;
Kann mir bitte jemand helfen?
Antwort1
Es sieht so aus, als ob Sie nur die Leerzeichen entfernen möchten, die vor oder nach einem Semikolon stehen. In diesem Fall:
$ 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;
Wie es funktioniert:
Der sed-Ersetzungsbefehl sieht normalerweise so aus, s/old/new/
wobei es old
sich um einen regulären Ausdruck handelt. In diesem Fall fügen wir ein g
Suffix hinzu, um anzuzeigenweltweitErsetzung (im Gegensatz zur Ersetzung nur einer Instanz). In unserem Fall old
entspricht jedes a ;
und jedes umgebende Leerzeichen: s/[[:space:]]*;[[:space:]]*
. Dies wird durch ersetzt, new
was einfach ein ist ;
.
Antwort2
Ich würde abholen perl
, denn dann können Sie split
und 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;
Dadurch werden alle Leerzeichen aus den Feldern entfernt. Das Ergebnis ist:
03139;5;IT1234978208;20150930;CTZ13/31.12.15;
03137;6;IT1234978206;20151015;CTZ13/31.11.18;
03134;8;IT1234974406;20151212;CTZ13/37.13.17;
Wenn Sie jedoch nur führende/nachfolgende Leerzeichen entfernen möchten:
s/^\s+|\s+$//g für @fields;
Dies kann wie folgt in eine Zeile zusammengefasst werden:
perl -F; -lape 's/^\s+|\s+$//g for @F; print join ";", @F;'
Wo:
-F;
setzt Trennzeichen-l
sagt, Zeilenenden automatisch entfernen/erneut hinzufügen.-a
wird automatisch aufgeteilt (-F
standardmäßig auf dem Trennzeichen in oder Leerzeichen)-e
lautet „Führen Sie diesen Snippet aus“.