У меня есть такой CSV-файл:
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;
Я ищу обходной путь, чтобы удалить все пробелы для каждой строки CSV с помощью sed
команды в Korn Shell, и получил что-то вроде этого:
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;
Может ли кто-нибудь мне помочь?
решение1
Похоже, вы хотите удалить только те пробелы, которые находятся до или после точки с запятой. В этом случае:
$ 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;
Как это работает:
Команда подстановки sed обычно выглядит как s/old/new/
где old
есть регулярное выражение. В этом случае мы добавляем суффикс, g
чтобы указатьГлобальныйподстановка (в отличие от подстановки одного экземпляра). В нашем случае old
соответствует любому a ;
и любому окружающему пробелу: s/[[:space:]]*;[[:space:]]*
. Это заменяется на , new
который является просто a ;
.
решение2
Я бы взял perl
, потому что тогда можно split
и 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;
Теперь это удалит все пробелы в полях, что даст:
03139;5;IT1234978208;20150930;CTZ13/31.12.15;
03137;6;IT1234978206;20151015;CTZ13/31.11.18;
03134;8;IT1234974406;20151212;CTZ13/37.13.17;
Но если вы просто хотите удалить начальный/конечный пробел:
s/^\s+|\s+$//g для @fields;
Это можно записать в одну строку так:
perl -F; -lape 's/^\s+|\s+$//g for @F; print join ";", @F;'
Где:
-F;
устанавливает разделитель-l
говорит об автоматическом удалении/повторном добавлении окончаний строк.-a
автоматически разбивается (по умолчанию на разделитель-F
или пробел)-e
«выполнить этот фрагмент».