sed无法删除换行符


12

我已经使用sed了一段时间了,但是这是我遇到的一个怪癖,我无法解决。

让我用实际情况解释我的问题。


场景#1

printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard

在第一个命令中,我将printf输出传递到,xclip以便将其复制到剪贴板。现在,printf不同于echo默认情况下不会在末尾插入新行。因此,如果我将此内容粘贴到终端中,ls则复制的命令不会自动运行。

在第二行中,末尾有一个新行,因此粘贴剪贴板内容也会导致命令在剪贴板中运行。

这对我来说是不可取的。因此,我想使用来删除换行符sed,但失败了,如下图所示。

场景#2

echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard

剪贴板中的内容仍然包含换行符。当我将其粘贴到终端时,该命令将自动运行。

我还尝试删除回车符\r。但是娜达 似乎我在这里错过了非常关键/基本的东西。

Answers:


16

sed\n分隔线上的分隔符-在输入时始终将其删除,在输出时将其重新插入。有从来没有一个\n在ewline字符sed未曾发生,你做了一个编辑的结果模式的空间。 注意:除了GNU sed-z模式...

只需使用tr

echo ls | tr -d \\n | xclip -selection clipboard

或者,更好的是,sed完全忘记了:

printf ls | xclip -selection clipboard

这将删除所有换行符,在这种generate-text | xclip情况下通常是不希望的。此答案仅删除最后一个换行符。
汤姆·黑尔

7

除换行符外,许多文本处理工具(包括sed)都对行的内容进行操作。在处理一行时,sed要做的第一件事是在末尾去除换行符,然后执行脚本中的命令,并在打印输出时添加最后的换行符。因此,您将无法使用sed删除换行符。

要删除所有换行符,可以使用tr

echo "ls" | tr -d '\n' | xclip


4

您可以通过将-z选项传递给sed来替换换行符。

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

Sed手册页:

-z,-null-数据用NUL字符分隔行


这将删除所有换行符,这种情况通常是不希望的| xclip
汤姆·黑尔

2

如果您只是将命令放在剪贴板中

echo -n "ls " | xclip -selection clipboard

如果您还需要进行更复杂的转换,

echo "ls  " | perl -pe 's/\n//' | xclip -selection clipboard

嗯 平滑的解决方案。我想也许是时候转向perl或python来使用正则表达式了。
shivams 2015年

3
@shivams - perlpython慢得多sed正确使用即可。但是,学会正确使用它是关键。
mikeserv

@mikeserv-我同意;oneliner sed的特殊之处很棒。如果转换将变得更加复杂,那么我更喜欢perl / python / gawk。
JJoao 2015年

1
@JJoa:您的偏好是您自己的,但不仅sed可以处理单行代码,而且可以做的比您提到的其他任何工具都快。
mikeserv

1
@mikeserv-再次,我同意你的看法。大约一年前,我有一个用sed编写的翻译系统EN-PT(20000 s /.../.../),由sed生成!而且有效!后来它成为Perl,具有数组,哈希,函数,程序包和CPAN。
JJoao 2015年

1

删除最后一个换行符,请通过以下管道传递:

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

sed\0如果定界符设置为NULvia -z,则不会在流的末尾添加a ,而要创建POSIX文本文件(定义为以结束\n),它将始终输出\n没有的final -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+$//'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.