sed 无法删除换行符

sed 无法删除换行符

我已经使用了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。但没什么。看来我在这里遗漏了一些非常重要/基本的东西。

答案1

sedewlines上的分隔符\n- 它们总是在输入时被删除并在输出时重新插入。有绝不\n模式空间中的 ewline 字符,sed该字符不是由于您所做的编辑而出现的。 sed注意: GNU模式除外-z...

只需使用tr

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

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

printf ls | xclip -selection clipboard

答案2

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

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

Sed 手册页:

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

答案3

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

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

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

答案4

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

echo -n "ls " | xclip -selection clipboard

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

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

相关内容