删除mac中一行末尾的制表符

use*_*178 1 macos bash shell sed

我有以下标签分隔的输入文件.我想删除行尾的尾随选项卡并执行"在文件中",这样我就不必将修改后的数据输出到新文件.原因是存在大量数据,因此我不希望效率低下并读入数据然后再将其写出来.

Hybridization REF   Gene_Symbol Chromosome  Genomic_Coordinate  TCGA-13-A5FT-01A-11D-A409-05    TCGA-13-A5FU-01A-11D-A409-05    TCGA-29-A5NZ-01A-11D-A409-05    TCGA-3P-A9WA-01A-11D-A409-05    TCGA-59-A5PD-01A-11D-A409-05    TCGA-5X-AA5U-01A-11D-A409-05    TCGA-OY-A56P-01A-12D-A409-05    TCGA-OY-A56Q-01A-11D-A409-05    TCGA-VG-A8LO-01A-11D-A409-05    TCGA-WR-A838-01A-12D-A409-05
cg00000029  RBL2    16  53468112    0.162232896986279   0.191627667901702   0.0712181967886229  0.0797617926225958  0.134907151266991   0.0541415985613948  0.0898579298345672  0.037865566345129   0.0681542463965581  0.101053013486289   
cg00000108  C3orf35 3   37459206    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  
cg00000109  FNDC3B  3   171916037   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  
Run Code Online (Sandbox Code Playgroud)

要做到这一点,我一直在使用以下变体:

sed -i '' 's/\t\n/\n/g' input.txt
Run Code Online (Sandbox Code Playgroud)

但这甚至不会删除尾随标签.我使用的是Mac OS X,所以没有GNU.解决办法是什么?

编辑

我在这里发布了文本文件

gho*_*oti 5

任何假设\t将由sed直接解释的答案都假定为GNU sed,这是OSX中没有的.但是你有bash,所以你有一个简单的printf转换为您的脚本:

$ sed -i '' -e $'s/\t$//' input.txt
Run Code Online (Sandbox Code Playgroud)

在这种情况下,脚本引用了扩展反斜杠转义序列的引号.请注意,这是一个BASH功能,我们用它来更明智地将内容放入sed中.

将此与您问题中的脚本变体相比较,我在搜索正则表达式中加上一个美元符号来表示搜索字符串的结尾 - 这个脚本基本上说:

  • s - 替代
  • / \t$- 位于行尾的任何标签,
  • // - 用空字符串.

我们不需要g替换的("全局")选项,因为sed会自动将替换应用于文件的每一行.