bash 中的 sed:'-n' 作为输入被区别对待吗?

bash 中的 sed:'-n' 作为输入被区别对待吗?

我正在努力解决sedbash 中的一个问题,该问题在 macOS 和 Ubuntu 上都存在。在长时间的调试过程中,我将其归结为这个最小的示例:

echo "abcde" | sed 's/.*/x/'
结果是:

X

这是有道理的,因为正则表达式用sed替换了任何输入x

相似地:

echo "" | sed 's/.*/x/'

X

echo "-a" | sed 's/.*/x/'

X

等等。然而:

echo "-n" | sed 's/.*/x/'

请注意,现在的输出是空的

发生了什么事?为什么"-n"输入的sed处理方式与任何其他输入(或无输入)不同?

答案1

echo,不是sed

例如,您可以使用以下工具检查输出hexdump -cx

echo a | hexdump -cx
0000000   a  \n                                                        
0000000    0a61                                                        
0000002

对于echo a,您将获得输出a和换行符\n或 0x0a。

echo "" | hexdump -cx
0000000  \n                                                            
0000000    000a                                                        
0000001

现在,由于字符串为空,所以您只会得到一个换行符。

echo "-n" | hexdump -cx

-n表示echo不输出末尾的换行符。因此,现在您没有要回显的字符串,也没有附加的换行符。所以什么都没有。

echo没有选项-a,因此-a被解释为要回显的字符串而不是选项。

因此,按照$如下提示:

$ echo -n -a  | sed 's/.*/x/'
x$ echo  -a  | sed 's/.*/x/'
x

相关内容