Bash 如何删除sed创建的EOF空行
我正在使用sed修改文本文件的第一部分。问题是sed会在文件末尾自动引入一个空行 你知道怎么解决这个问题吗?(不使用truncate,因为我不想在MacOS中安装其他软件)Bash 如何删除sed创建的EOF空行,bash,macos,awk,sed,scripting,Bash,Macos,Awk,Sed,Scripting,我正在使用sed修改文本文件的第一部分。问题是sed会在文件末尾自动引入一个空行 你知道怎么解决这个问题吗?(不使用truncate,因为我不想在MacOS中安装其他软件) 谢谢 对您的问题的快速回答是将您的输出通过管道传输到另一个cmd,如awk: sed 'commands' file | awk '(NR>1){printf "%s\n",l}{l=$0}END{printf "%s",l}' 这将删除最后一个。这不能通过sed来完成,下面的答案试图对此进行解释。更多的可能性可以在
谢谢 对您的问题的快速回答是将您的输出通过管道传输到另一个cmd,如
awk
:
sed 'commands' file | awk '(NR>1){printf "%s\n",l}{l=$0}END{printf "%s",l}'
这将删除最后一个
。这不能通过sed
来完成,下面的答案试图对此进行解释。更多的可能性可以在
为什么sed
总是以
结尾?
这个问题的答案取决于对标准的解释和您使用的sed
的实现
根据报告:
在默认操作中,sed
应循环添加一行输入,
在模式空间中减去其终止字符
。
如果模式中存在
,则应跳过输入读取
结束上一周期的D
命令之前的空格。sed实用程序
然后应按顺序应用其地址选择的所有命令
模式空间,直到命令开始下一个循环或退出。如果没有
命令显式地开始一个新的周期,然后在脚本结束时执行
模式空间应复制到标准输出(除非-n
并删除图案空间。每当
模式空间写入标准输出或命名文件时,sed
应
立即用
紧跟其后
这意味着两件事:
- 如果行未被
终止,则不会对其进行处理 - 写入标准输出的任何内容都会以
终止,即命令周期结束或发出命令
或p
后的输出p
sed(sunos5.10)SUNWcsu 11.10.0版本=2005.01.21.15.53
$ echo -n foo | sed 'p'
$ echo -n 'foo\nbar' | sed 'p'
foo
foo
如果未由
终止的行没有处理。否则,将在任何输出处添加
与posix的解释类似
通常,sed
循环复制一行输入,不包括其
将换行符终止为
模式空间(除非D
函数后还有剩余的内容)应用所有命令
使用选择该模式空间的地址,将模式空间复制到标准输出,并追加
删除换行符,并删除图案空间
这是没有测试,因为我没有mac电脑
在这个问题上,政府似乎有着稍微不同的观点:
sed
通过在每行输入上执行以下循环进行操作:
首先,sed从输入流中读取一行,删除任何尾随行
换行符,并将其放置在模式空间中。那么命令就是
执行;每个命令都可以有一个与其关联的地址:addresses
是一种条件代码,仅当
在执行命令之前验证条件
当到达脚本末尾时,除非使用了-n
选项,否则模式空间的内容将打印到输出流中,如果删除了尾随换行符,则将其添加回
这意味着:
- 所有行都被处理,所有行或未被
- 如果达到命令周期结束,则添加的
数量与最初删除的数量相同
sed(GNU-sed)4.2.2
在下面的示例中,换行符仅添加在p
之后,而不是在循环结束之后。(换行符是十六进制的012
)
原因是:
实际上,如果sed
打印一行而没有终止换行符,则
但是,一旦有更多的文本出现,将立即打印缺少的换行符
发送到相同的输出流,该输出流给出“最小期望值”
惊奇“即使它不发出类似于sed-np的命令
与cat
完全相同
总而言之:根据,您总是会得到一个以
结尾的输出文件,但它可能不是输入的最后一行。根据,您的输出终止时与输入文件结尾处的数量相同
问题:GNU的
sed--posix
是真正的posix吗?请在您的帖子中以代码标签的形式向我们展示示例输入和示例输出。无论您如何使用sed,它都会引入EOF空行@RavinderSingh13@MMManuel我更新了我的答案,我希望它能解释它,告诉你如何实现你的目标。
$ echo -n foo | hexdump -b
0000000 146 157 157
0000003
$ echo -n foo | sed --posix 'p' | hexdump -b
0000000 146 157 157 012 146 157 157
0000007