为什么使用 cat 与 echo 传送到此 sed 命令会不一致?

为什么使用 cat 与 echo 传送到此 sed 命令会不一致?

受到这个问题的启发:sed:N 命令不读取单行我想了解为什么以下两个命令之间似乎不一致:

#1.回声

该命令不产生任何输出

$ echo -en 'abc\n' | sed -n 'N;p'
$

输出的十六进制转储echo

od - 八进制转储

$ echo -en 'abc\n' | od -tx1
0000000 61 62 63 0a
0000004

十六进制转储

$ echo -en 'abc\n' | hexdump -C
00000000  61 62 63 0a                                       |abc.|
00000004

#2.猫

如果我将字符串“abc\n”放入如下文件中:

1: abc
2:

这是一行,abc上面有字符串,后跟换行符(\n又名。0x0A)。然后像以前一样将其通过管道传输sed,我得到:

$ cat abc.txt | sed -n 'N;p'
abc

$

该输出包含字符串,abc后跟 2 个换行符。

od - 八进制转储

$ cat abc.txt | od -tx1
0000000 61 62 63 0a 0a
0000005

十六进制转储

$ cat abc.txt | hexdump -C
00000000  61 62 63 0a 0a                                    |abc..|
00000005

我有点困惑,这是怎么回事?

更新

好的,我的问题是我如何创建abc.txt文件@choroba 指出。我正在创建文件vim,但没有意识到它添加了 2 个换行符。当我启用特殊字符的可见性时,它变得更加明显:

:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<,
:set list

现在vim文件abc.txt看起来像这样:

abc$
$

如果我将文件创建为@choroba 建议然后文件abc.txt按预期显示:

$ cat abc.txt | od -tx1
0000000 61 62 63 0a
0000004

它的行为与原始echo示例相同:

$ cat abc.txt | sed -n 'N;p'
$ 

原版

我最初关于为什么sed -n 'N;p'不显示任何内容的问题得到了解答,感谢@enzotib的回答。我没有注意到 POSIX 标准中的内容:

如果没有下一行输入可用,则 N 命令动词应分支到脚本末尾并退出,而不开始新循环或将模式空间复制到标准输出

答案1

您是如何创建该文件的?它包含两个换行符,而不是一个。再试一次

echo abc > abc.txt
cat abc.txt | sed -n 'N;p'

答案2

POSIX 标准规定:

[2地址]将下一行输入(减去其终止 <newline>)附加到模式空间,使用嵌入的 <newline> 将附加的材料与原始材料分开。请注意,当前行号发生变化。如果没有下一行输入可用,则 N 命令动词应分支到脚本末尾并退出,而不开始新循环或将模式空间复制到标准输出

因此,如果有或没有下一行,行为会非常不同。

正如您从 的输出中看到的od -x,您的输入仅在换行符上有所不同。

相关内容