2

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

sed '/^\s*$/d'

但是没有删除 las 空白行。

4

4 回答 4

3

为什么要sed打印换行符?

当您阅读sedPOSIX 标准时,它会声明:

每当将模式空间写入标准输出或命名文件时,sed应立即使用<newline>.

可以在此答案中找到更多详细信息。

删除最后一个<newline>

  • truncate如果您只想从文件中删除一个字符,您可以这样做:

    truncate -s -1 <file>
    

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

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

    SIZE也可以由以下修饰字符之一作为前缀:' +' 扩展,' -'减少,' <'至多,' >'至少,' /'向下舍入为倍数,' %'向上舍入为倍数。

  • 其他答案可以在如何删除换行符如果它是文件中的最后一个字符?

于 2018-05-28T16:45:18.573 回答
1

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

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

不仅是最后一个。

如果你想删除最后一行,如果它是空的,那么你可以使用以下命令:

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

输入:

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

输出:

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

b

c

说明:

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

重要的:

如果您的文件来自 Windows 并包含一些回车符 ( \r),则此sed命令将不起作用!!!您将需要使用dos2unix或删除那些嘈杂的字符tr -d '\r'

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

在修复文件之前:

猫:

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

外径:

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

赛德:

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 -c test 
0000000   a  \n  \n   b  \n  \n   c  \n  \t      \t      \n
0000015

赛德:

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

b

c

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

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

perl -pe 'chomp if eof' test
a

b

c

您可以-i为更改添加选项in-place(在运行命令之前备份文件)。最后但并非最不重要的一点是,您可能必须按照此处所述从文件中删除回车。

于 2018-05-28T05:46:28.217 回答
1

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

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

于 2018-05-28T17:26:46.213 回答
1

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

$ cat file
a
b
c

$ awk 'NR>1{print p} {p=$0}' file
a
b
c
$
于 2018-05-28T14:18:00.767 回答