【问题标题】:Command to replace single space with tabs in a text file用文本文件中的制表符替换单个空格的命令
【发布时间】:2020-02-08 15:21:48
【问题描述】:

所以我有一个文本文件,问题是空格和制表符都用于分隔列值,由于不一致,这给我带来了很多问题。例如:

ID Name    Class Time
1 Johnson  5-D 6pm
         .
         .
         .

正如您在示例中看到的,ID 和 Name 都用一个空格分隔,而 Name 和 Class 用制表符分隔。

我如何编写一个 sed 命令来用制表符替换文本文件中的所有单个空格?我希望生成一个新的文本文件,如下所示:

ID      Name      Class     Time
1       Johnson   5-D        6pm

此时对齐无关紧要,我只想用制表符替换单个空格。

编辑:也欢迎使用 awk 脚本

【问题讨论】:

  • 您也可以添加您尝试过的内容吗?如果您需要资源来开始使用sed,请参阅stackoverflow.com/tags/sed/info
  • 看看man unexpand
  • 记录一下:在上面的文本示例中,此阶段根本没有制表符。
  • 您的任何字段都可以包含空白或制表符吗?
  • @tink SO 有一个不幸的习惯,就是在渲染 markdown 时将制表符变成空格。让提供示例 TSV 数据变得很痛苦。

标签: regex linux awk sed


【解决方案1】:

tr:

 tr ' ' '\t' <inputfile >outputfile

这会将每个空格字符替换为一个制表符。

如果您需要这个,您还可以使用一个制表符替换一系列多个空格

 tr -s ' ' '\t' <inputfile >outputfile

【讨论】:

  • tr 是正确的工具,但请注意第二个命令,因为它会删除以空格分隔的空字段。
【解决方案2】:

使用column函数:

column -t file

来自man column

-t   Determine the number of columns the input contains and create a table. Columns are
     delimited with whitespace, by default, or with the characters supplied using the -s
     option. Useful for pretty-printing displays.

【讨论】:

  • 它不工作。我不能假设所有列都用空格分隔。名称和类由制表符而不是空格分隔。
  • @Maxx 正如文档所说的Columns are delimited with whitespace 和“空白”包括制表符和空白(“空白”是您迄今为止所说的“空格”的真正术语)。因此,如果“它不起作用”,那不是因为有空格和制表符作为分隔符。此命令的真正问题是它不会按照您的要求通过制表符分隔数据。
【解决方案3】:

这可能会起到作用sed -i -e 's/\s/\t/g' filename.txt

【讨论】:

  • 也许使用y/\s/\t/而不是s/\s/\t/g
【解决方案4】:

使用perl 获取其高级正则表达式(特别是lookbehind 和lookahead 断言以匹配单个空格且两边没有其他空格):

perl -pi -e 's/(?<=\S) (?=\S)/\t/g' input.txt

【讨论】:

  • 我不知道 Perl,但是您的正则表达式是否与字符串开头或结尾的单个空格不匹配。你想要/(?&lt;! ) (?! )/吗?
  • @CarySwoveland 我不会担心这样的事情,除非 OP 说他们的数据有空字段。
猜你喜欢
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
相关资源
最近更新 更多