シェルスクリプトを使用してセミコロンで区切られたファイル内のフィールドからスペースを削除する

シェルスクリプトを使用してセミコロンで区切られたファイル内のフィールドからスペースを削除する

次のような 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;

私は、Korn Shell の use コマンドを使用して、すべての csv 行の空白をすべて削除する回避策を探していますsed。次のようなものが表示されます。

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グローバル置換(1 つのインスタンスを置換するだけではない)。この場合、 はold任意の a;と周囲の空白文字と一致します: s/[[:space:]]*;[[:space:]]*。これは に置き換えられますが、newこれは単なる です;

答え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;

ただし、先頭/末尾のスペースを削除したいだけの場合は、次のようにします。

@fields の場合は s/^\s+|\s+$//g;

これを 1 行にまとめると次のようになります。

perl -F; -lape 's/^\s+|\s+$//g for @F; print join ";", @F;'

どこ:

  • -F;区切り文字を設定します
  • -l行末を自動的に削除/再追加します。
  • -a自動分割されます(デフォルトでは区切り文字-Fまたは空白で分割されます)
  • -e「このスニペットを実行する」です。

関連情報