我正在努力解决sed
bash 中的一个问题,该问题在 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