【问题标题】:Remove the final newline (\n) from a shell pipeline [duplicate]从 shell 管道中删除最后的换行符 (\n) [重复]
【发布时间】:2025-11-27 16:00:01
【问题描述】:

我有:

alias pbcopy='xclip -selection clipboard -in'

这让我可以执行date | pbcopy 之类的操作,以获取剪贴板中的日期。

但是,我还在日期末尾得到一个换行符,粘贴后需要手动删除。

如何从管道中删除最后一个换行符(并且只删除最后一个换行符)?

【问题讨论】:

    标签: bash shell pipe newline zsh


    【解决方案1】:

    管道:

    sed -z '$ s/\n$//'
    

    如果分隔符通过-z 设置为NULsed 将不会在流的末尾添加\0,而创建 POSIX 文本文件(定义为以 \n 结尾),它总是会输出一个最终的\n 而没有-z

    例如:

    $ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
    foo
    bartender
    

    为了证明没有 NUL 添加:

    $ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
    00000000: 666f 6f0a 6261 72                        foo.bar
    

    要删除多个尾随换行符,请通过管道:

    sed -Ez '$ s/\n+$//'
    

    【讨论】: