為什麼使用 cat 與 echo 通過管道傳輸到此 sed 命令的不一致?
受這個問題的啟發:sed: N command does not read single line我想了解為什麼以下 2 個命令之間似乎存在不一致:
#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 命令動詞應分支到腳本的末尾並退出,而無需開始新的循環或將模式空間複製到標準輸出
POSIX 標準規定:
$$ 2addr $$ N將下一行輸入(減去其終止 <newline>)附加到模式空間,使用嵌入的 <newline> 將附加材料與原始材料分開。請注意,目前行號會發生變化。如果沒有可用的下一行輸入,則 N 命令動詞應分支到腳本的末尾並退出,而無需開始新的循環或將模式空間複製到標準輸出。
所以如果有或沒有下一行,行為是非常不同的。
從 的輸出中可以看出,您的輸入
od -x
僅在換行符處有所不同。
你是如何創建文件的?它包含兩個換行符,而不是一個。再試一次
echo abc > abc.txt cat abc.txt | sed -n 'N;p'