首页 > 解决方案 > 如何避免sed中的最后一个换行符?

问题描述

我想删除文件的最后一部分,从遵循特定模式的行开始,包括前面的 newline

因此,在“STOP”处停止,以下文件:

keep\n
STOP\n
whatever

应该输出:

keep

没有尾随换行符。

我试过这个,逻辑似乎有效,但似乎 sed 每次打印缓冲区时都会添加一个换行符。我怎样才能避免这种情况?当 sed 不操作缓冲区时,我没有这个问题(即,如果我删除 STOP,sed 在文件末尾输出“whatever”而没有换行符)。

printf 'keep
STOP
Whatever' | sed 'N
/\nSTOP/ {
  s/\n.*$//
  P
  Q
}
P
D'

我正在尝试编写一个 git 清理过滤器,并且每次提交时都不能添加新的换行符。

标签: sed

解决方案


这可能对您有用(GNU sed):

sed -z 's/\nSTOP.*//' file

-z选项将整个文件放入内存中,并且替换命令从第一个换行符中删除文件的其余部分,然后是STOP.


推荐阅读