从“剪贴板”中删除尾随新行以防止在终端上执行?

从“剪贴板”中删除尾随新行以防止在终端上执行?

有没有办法通过某种过滤器运行您复制到“剪贴板”的任何内容?理想情况下,从您复制的内容中删除尾随换行符,以便它不会在终端中自动运行?

这就是我复制相关测试时的样子,有时我会忘记这是一个新行。
在此输入图像描述

答案1

良好的现代终端支持括号内的粘贴:当您使用终端的粘贴命令时,它会在剪贴板内容周围发送特殊的转义序列。如果您的 shell 支持括号粘贴,它将按原样粘贴剪贴板内容,包括任何控制字符,特别是尾随换行符不会触发命令的执行。

Zsh ≥5.1 支持括号粘贴并默认打开。旧版本可以被教导。 Bash ≥4.4 支持括号粘贴,如果添加set enable-bracketed-paste on~/.inputrc

如果您的终端或 shell 不支持括号粘贴,您可以定义一个 shell 函数,该函数在粘贴时不带尾随换行符。

在 zsh 中,以下命令调用剪贴板的内容,减去尾随换行符,并将其显示出来进行编辑(即使有多行):

print -z -- "`xsel -b`"

在 bash 中,您可以将剪贴板的内容减去尾随换行符推送到历史堆栈。之后,按Up调出命令进行编辑。

history -s -- "`xsel -b`"

答案2

是的,用于cat粘贴到文件中,做任何你喜欢的事情,然后执行它。

对于本例:

$ cat > tmp
[paste][Ctrl+D]
$ tr -d '\n' <tmp | xclip # this remove all "new line" characters 
                          #  and copy back to clipboard

答案3

自版本 0.13(2016-09 发布)以来,xclip似乎有一个未记录的选项-r,它完全满足了需要:从文本中删除最后一个换行符。看https://github.com/astrand/xclip/issues/7。至少它在 Ubuntu 22.04 上对我有用。

答案4

我意识到我们可以一行完成,灵感来自 @RSFalcon7 答案

通过使用xsel, 复制到主要选择

cat | tr -d '\n' | xsel

[paste], 2 times[Ctrl-D]

相关内容