sed 无法删除换行符

shi*_*ams 17 sed newlines

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

让我用实际案例来解释我的问题。


场景#1

printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard
Run Code Online (Sandbox Code Playgroud)

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

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

这对我来说是不可取的。所以,我想使用 删除换行符sed,但它失败了,如下面的场景所述。

场景#2

echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard
Run Code Online (Sandbox Code Playgroud)

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

我也尝试删除回车符\r。但是纳达。看来我在这里遗漏了一些非常关键/基本的东西。

mik*_*erv 21

sed\newlines上的分隔符 - 它们总是在输入时被删除并在输出时重新插入。有从来没有一个\n在ewline字符sed未曾发生,你做了一个编辑的结果模式的空间。 注意:除了 GNUsed-z模式...

只需使用tr

echo ls | tr -d \\n | xclip -selection clipboard
Run Code Online (Sandbox Code Playgroud)

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

printf ls | xclip -selection clipboard
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 8

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

要删除所有换行符,您可以tr改用:

echo "ls" | tr -d '\n' | xclip
Run Code Online (Sandbox Code Playgroud)


小智 8

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

sed -z 's/\n/ /g'
Run Code Online (Sandbox Code Playgroud)

Sed 手册页:

-z, --null-data用 NUL 字符分隔行