【问题标题】:remove spaces, but keep tabs删除空格,但保留标签
【发布时间】:2015-11-10 23:31:00
【问题描述】:

我有一个包含 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

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

【问题讨论】:

  • 只是文字空格?还是您的意思是其他非空格空格?
  • 另外 - 你为什么将lape 作为你的标志? pe 在这里似乎就足够了吗?

标签: perl awk sed


【解决方案1】:

只删除空格,而不是\s,它也匹配制表符:

sed 's/ \+//g' file

如果你想删除这些空格,只要它们出现在制表符之后,说:

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

来自perldoc perlretut

\s 匹配空白字符、集合 [\ \t\r\n\f] 等

【讨论】:

  • 我想我会选择+ 而不是*。直觉上,它似乎匹配零个空格并用零个空格替换它是多余的。
  • @Sobrique 好点。我尝试使用s/ +//g' 并没有工作,现在我看到我错过了逃避+。无论如何,最好按照你的建议说s/ //g
  • 如果不使用global,我认为需要转义+。例如,下面是我如何从每行的开头和结尾修剪空格(不包括制表符):sed 's/^ \+//; s/ \+$//'
  • @NoamManos + 的转义是由于使用了普通的 Sed。如果您使用扩展正则表达式,则可以省略它:sed -r 's/ +//g'
【解决方案2】:

如果只是空格,您可以使用' ' 而不是\s

例如

s/ //g;

当然,鉴于您正在执行 lape-a 表示“在空白处自动拆分”,您可以:

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

【讨论】:

    【解决方案3】:

    您可以创建自己的字符类,它是 空格和制表符的所有事物的 否定,此字符类表示所有为空格的字符 - 制表符:

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

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

    ^ 内部的 [ ... ] 否定这个字符类

    \S 表示不在\s 中的所有内容

    \t代表制表符

    【讨论】:

      【解决方案4】:

      使用 awk,重新格式化输出以专门使用制表符,

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 2015-08-02
        • 2016-10-09
        • 2012-08-17
        • 2021-03-10
        相关资源
        最近更新 更多