删除空格,但保持标签

时间:2015-11-10 14:01:30

标签: perl awk sed

我有一个带有3列的制表符分隔文本文件。

在某些列中,我想删除单个或多个空格。但我想保持每列之间的标签分隔以及换行符。

我试过

perl -lape 's/\s+//sg

但删除了所有空格,也删除了制表符空格

我的文件看起来像这样

col1 col2    col3
1    test    test
2       test test
3     test    test

我想要

col1   col2   col3
1      test   test
2      test   test
3      test   test

所以我只想保留不同列之间的制表空间,而不是单个空格。我希望这很清楚。

4 个答案:

答案 0 :(得分:6)

只需删除空格,而不是\s,它也与标签匹配:

sed 's/ \+//g' file

如果你想删除这些空格,只要它们出现在标签之后,请说:

sed 's/\t */\t/g' file

来自perldoc perlretut

  

\ s 匹配空白字符,集合[\ \ t \ r \ n \ n \ f]和其他

答案 1 :(得分:4)

如果它只是空格,您可以使用' '代替\s

E.g。

s/ //g;

当然,如果您正在进行lape-a表示“在空白处进行自动分割”,您可以:

perl -ane 'print join ("\t", @F );'

答案 2 :(得分:2)

你可以创建自己的角色类,它是空格和标签的所有东西的否定,这个字符类代表所有空白字符 - 标签:

perl -lape 's/[^\S\t]+//sg'

[ ... ]定义了一个字符类

^内的

[ ... ]否定了这个字符类

\S代表\s

以外的所有内容

\t表示制表符

答案 3 :(得分:1)

使用awk,重新格式化输出以特别使用制表符,

awk -v OFS='\t' '{$1=$1}1' file

奇怪的$1=$1强制要使用输出字段分隔符(选项卡)重写当前记录