首页 > 解决方案 > 使用 sed 删除文本文件最后一行中的新行

问题描述

我想使用 sed 删除文本文件最后一行中的新行。例如输入如下:

1
1
1
1
1
1

我希望在文本文件末尾没有任何新行的情况下得到这样的输出:

 1
 1
 1
 1
 1
 1

标签: textsed

解决方案


从一些测试数据开始:

$ printf "%s\n" {a..e} "" "" | cat -n
     1  a
     2  b
     3  c
     4  d
     5  e
     6
     7

我会这样处理问题:反转文件,删除 顶部的空白行,然后重新反转文件

$ printf "%s\n" {a..e} "" "" | tac | awk 'NF && !p {p=1}; p' | tac | cat -n
     1  a
     2  b
     3  c
     4  d
     5  e

NF是“此记录中的字段数”的 awk 变量。p是我用来指示何时开始打印的变量。第一次 NF 不为零时,我们将p变量设置为真值。最后的独立p触发默认操作以打印记录。


删除最后一行的换行符是另一回事。

鉴于此文件:

$ cat > file
first
second
third
$ od -c file
0000000   f   i   r   s   t  \n   s   e   c   o   n   d  \n   t   h   i
0000020   r   d  \n
0000023

我们可以使用 perl:

$ perl -i -0777 -ne 's/\n+$//; print' file

$ od -c file
0000000   f   i   r   s   t  \n   s   e   c   o   n   d  \n   t   h   i
0000020   r   d
0000022

tr将换行符转换为其他字符,并 sed 删除尾随字符

$ tr '\n' '\034' < file | sed $'s/\034$//' | tr '\034' '\n' | od -c
0000000   f   i   r   s   t  \n   s   e   c   o   n   d  \n   t   h   i
0000020   r   d
0000022

推荐阅读