使用sed删除最后一个换行符

时间:2018-05-28 04:33:58

标签: linux unix sed file-manipulation end-of-line

如何从文件中删除最后一个\n。该文件为最后一个文本行中的换行符创建了最后一个空行。我正在使用这个命令:

sed '/^\s*$/d'

但是不会删除那个拉米空白行。

4 个答案:

答案 0 :(得分:2)

为什么sed会打印换行符?

当您阅读sed POSIX standard时,它会说明:

  

每当模式空间被写入标准输出或命名文件时,sed将立即跟随<newline>

可以在this answer中找到更多详细信息。

删除最后一个<newline>

  • truncate :如果您只想从文件中删除一个字符,则可以执行以下操作:

    truncate -s -1 <file>
    

    这使文件缩短一个字节,即删除最后一个字符。

      

    来自 man resize :   -s, --size=SIZE设置或调整文件大小SIZE字节

         

    SIZE也可以使用以下修改字符之一作为前缀:   &#39; +&#39;延伸,&#39; -&#39;减少,&#39; <&#39;至多,&#39; >&#39;至少,   &#39; /&#39;向下舍入到多个,%&#39;四舍五入到。

  • 其他答案可在How can I delete a newline if it is the last character in a file?

  • 中找到

答案 1 :(得分:1)

1)从文件中删除最后一个空行:

首先,您当前使用的命令将删除 所有 空行和空白行!

不仅仅是最后一个。

如果要删除最后一行(如果它为空/空白),则可以使用以下命令:

sed '${/^[[:blank:]]*$/d}' test

<强> INPUT:

cat -vTE test                                                                                                                  
a$
$
b$
$
c$
^I ^I $

<强>输出:

sed '${/^[[:blank:]]*$/d}' test                                                                                                
a

b

c

<强>说明:

  • 第一个$会告诉sed仅在最后一行进行处理
  • /^[[:blank:]]*$/条件将由sed评估,如果此行为空或仅由空白字符组成,则会触发对模式缓冲区的删除操作,因此不会打印最后一行
  • 您可以重定向sed命令的输出以将其保存到新文件或使用-i选项进行就地更改(如果您使用它,请备份您的文件!! !! )或使用-i.bak强制sed在修改文件之前备份文件。

重要:

如果您的文件来自Windows并包含一些回车符(\r),则此sed命令将无效!您需要使用dos2unixtr -d '\r'删除这些嘈杂的字符。

对于包含回车<CR>\r^M)的文件:

在修复文件之前:

cat:

cat -vTE test 
a$
$
b$
$
c$
^I ^I ^M$

<强> OD:

od -c test 
0000000   a  \n  \n   b  \n  \n   c  \n  \t      \t      \r  \n
0000016

<强> sed的:

sed '${/^[[:blank:]]*$/d}' test                                                                                                
a

b

c

修复文件后

dos2unix test 
dos2unix: converting file test to Unix format ...

<强>猫:

cat -vTE test                                                                                                                  
a$
$
b$
$
c$
^I ^I $

<强> OD:

od -c test 
0000000   a  \n  \n   b  \n  \n   c  \n  \t      \t      \n
0000015

<强> sed的:

sed '${/^[[:blank:]]*$/d}' test                                                                                                
a

b

c

2)从文件中删除最后一个字符:

出于这个特殊目的,我建议使用perl

perl -pe 'chomp if eof' test
a

b

c

您可以将-i选项添加到更改in-place(在运行命令之前备份您的文件)。最后但同样重要的是,您可能必须从文件中删除回车符,如下所述。

答案 2 :(得分:1)

您的问题并不清楚,但这可能是您要求的:

$ cat file
a
b
c

$ awk 'NR>1{print p} {p=$0}' file
a
b
c
$

答案 3 :(得分:1)

您还可以使用sed下面的单行内容删除尾随空白行:

sed -e :a -e '/^\n*$/N;/\n$/ba'