Scripting

為什麼使用 cat 與 echo 通過管道傳輸到此 sed 命令的不一致?

  • August 16, 2013

受這個問題的啟發: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 &gt; abc.txt
cat abc.txt | sed -n 'N;p'

引用自:https://unix.stackexchange.com/questions/86997