Удаление пробелов из полей в файле, разделенном точкой с запятой, с помощью скрипта оболочки

Удаление пробелов из полей в файле, разделенном точкой с запятой, с помощью скрипта оболочки

У меня есть такой 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«выполнить этот фрагмент».

Связанный контент