我有一个这样的 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:]]*
。这被替换为new
which 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
是“执行这个片段”。