受到这个问题的启发: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
,您的输入仅在换行符上有所不同。