Macos 在粘贴板中从输入字符串中剥离换行符的最简单方法

Macos 在粘贴板中从输入字符串中剥离换行符的最简单方法,macos,unix,shell,Macos,Unix,Shell,当我运行以下命令(OS X 10.6)时,希望能够非常简单地解释用例: 粘贴板的末尾包含一个换行符。我想把它扔掉。pwd | tr-d'\n'| pbcopy printf $(pwd) | pbcopy 或 请注意,如果目录名中有空格字符,则应该引用这些字符。例如: echo -n "$(pwd)" | pbcopy 我编写了一个名为noeol的实用程序来解决这个问题。它通过管道将stdin传输到stdout,但如果有尾随的换行符,则将其忽略。例如 pwd | noeol | pbcopy

当我运行以下命令(OS X 10.6)时,希望能够非常简单地解释用例:


粘贴板的末尾包含一个换行符。我想把它扔掉。

pwd | tr-d'\n'| pbcopy

printf $(pwd) | pbcopy

请注意,如果目录名中有空格字符,则应该引用这些字符。例如:

echo -n "$(pwd)" | pbcopy

我编写了一个名为
noeol
的实用程序来解决这个问题。它通过管道将stdin传输到stdout,但如果有尾随的换行符,则将其忽略。例如

pwd | noeol | pbcopy
…我把
copy
化名为
noeol | pbcopy

$ man ascii | grep -E '\b00\b|\b0a\b'
     00 nul   01 soh   02 stx   03 etx   04 eot   05 enq   06 ack   07 bel
     08 bs    09 ht    0a nl    0b vt    0c np    0d cr    0e so    0f si

在这里查看:

对于我来说,我在
tr-d'\n'
方法上遇到了问题。在OSX上,我碰巧通过
brew安装coreutils
安装了coreutils包。这提供了所有“普通”GNU实用程序,它们的典型名称前面都有一个前缀g。例如,
head
就是
ghead

在IMO中,使用此选项更安全:

pwd | ghead -c -1 | pbcopy
您可以使用
od
查看输出情况:

$ pwd | ghead -c -1 | /usr/bin/od -h
0000000      552f    6573    7372    732f    696d    676e    6c6f    6c65
0000020      696c
0000022
vs

区别是什么

00
0a
是nul和换行符的十六进制代码。
ghead-c-1
仅“咀嚼”输出中的最后一个字符,然后将其交给
|pbcopy

$ man ascii | grep -E '\b00\b|\b0a\b'
     00 nul   01 soh   02 stx   03 etx   04 eot   05 enq   06 ack   07 bel
     08 bs    09 ht    0a nl    0b vt    0c np    0d cr    0e so    0f si

第一个是不安全的:字符串中可能有%。您可以这样使其安全:
printf'%s'$(pwd)| pbcopy
第二个命令非常有用。了解“echo而不换行”选项非常好:
echo-n“text”
“text\c”
此解决方案对我更有效,因为我使用别名来复制上一个命令:alias cplc='echo-n$(fc-ln-1)| pbcopy'side注意:如果您想这样做的原因是粘贴到Finder中的“Go to”字段中(键入
~
),您只需使用
pwd | pbcopy
,粘贴到文本字段中,然后按backspace。这也可以创建一个很好的别名,
alias copy=“tr-d'\n'| pbcopy”
。那不是要删除所有新行吗?如果我只想删除最后一行怎么办?@davidmm-是的,删除所有新行。我总是删除最后一个对我来说很有效的字符:
head-c-1
。在bashrc中,我喜欢:
别名cpwd=“pwd | tr-d'\n'| pbcopy”
)尽管@TaylorHawkes中的'head-c-1'在OSX上对我不起作用(BSD head不喜欢负值),但它确实指出它从所有行中剥离了新行,而不仅仅是从后面的行。一个有效的变体是
alias pbc='xargs echo-n | pbcopy'
$ pwd | /usr/bin/od -h
0000000      552f    6573    7372    732f    696d    676e    6c6f    6c65
0000020      696c    000a
0000023
$ man ascii | grep -E '\b00\b|\b0a\b'
     00 nul   01 soh   02 stx   03 etx   04 eot   05 enq   06 ack   07 bel
     08 bs    09 ht    0a nl    0b vt    0c np    0d cr    0e so    0f si