unix 从粘贴板的输入字符串中去除换行符的最简单方法

qc6wkl3g  于 2022-12-12  发布在  Unix
关注(0)|答案(5)|浏览(154)

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

$ pwd | pbcopy

粘贴板的末尾包含换行符。我想删除它。

nukf8bse

nukf8bse1#

pwd | tr -d '\n' | pbcopy

c7rzv4ha

c7rzv4ha2#

printf $(pwd) | pbcopy

echo -n $(pwd) | pbcopy

请注意,如果目录名称中有空白字符,则应将这些字符用引号括起来。例如:

echo -n "$(pwd)" | pbcopy
llmtgqce

llmtgqce3#

我写了一个名为noeol的实用程序来解决这个问题,它将stdin连接到stdout,但是如果有换行符的话,就省略掉后面的换行符。

pwd | noeol | pbcopy

......我将copy别名为noeol | pbcopy
点击此处查看:https://github.com/Sidnicious/noeol

w6lpcovy

w6lpcovy4#

对我来说,我对tr -d '\n'方法有问题。在OSX上,我碰巧通过brew install 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

$ pwd | /usr/bin/od -h
0000000      552f    6573    7372    732f    696d    676e    6c6f    6c65
0000020      696c    000a
0000023

区别在哪里?
000a是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
t30tvxxf

t30tvxxf5#

我们可以先删除结尾的换行符(如果有的话),然后将其作为follows提供给pbcopy

your_command | perl -0 -pe 's/\n\Z//' | pbcopy

我们也可以创建一个别名:

alias pbc="perl -0 -pe 's/\n\Z//' | pbcopy"

然后命令将变成:

pwd | pbc

相关问题