使用 shell 腳本從分號分隔檔案的欄位中刪除空格

使用 shell 腳本從分號分隔檔案的欄位中刪除空格

我有一個這樣的 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;

我正在尋找一種解決方法,透過sed在 Korn Shell 上使用命令來刪除每個 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;

有人可以幫我嗎?

答案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/whereold是正規表示式。在這種情況下,我們會加上一個g後綴來表示全球的替換(而不是僅替換一個實例)。在我們的例子中,old匹配任何 a;和任何周圍的空白:s/[[:space:]]*;[[:space:]]*。這被替換為newwhich is just 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是「執行這個片段」。

相關內容