Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何删除sed创建的EOF空行_Bash_Macos_Awk_Sed_Scripting - Fatal编程技术网

Bash 如何删除sed创建的EOF空行

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来完成,下面的答案试图对此进行解释。更多的可能性可以在

我正在使用sed修改文本文件的第一部分。问题是sed会在文件末尾自动引入一个空行

你知道怎么解决这个问题吗?(不使用truncate,因为我不想在MacOS中安装其他软件)


谢谢

对您的问题的快速回答是将您的输出通过管道传输到另一个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