このsedコマンドに送信するためにcatとechoを使用することの間に矛盾があるのはなぜですか?

このsedコマンドに送信するためにcatとechoを使用することの間に矛盾があるのはなぜですか?

この質問からインスピレーションを得ました。sed:N コマンドは 1 行を読みません。次の2つのコマンド間で不一致が発生する理由を知りたいです。

#1.エコ

このコマンドは出力を生成しません。

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

出力の16進ダンプecho

od - 8進ダンプ

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

16進ダンプ

$ 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 - 8進ダンプ

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

16進ダンプ

$ 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'何も表示されない理由についての元の質問に対する回答がありました。ありがとうございます。@エンジョチップ答え。 POSIX標準ではこれに気づかなかった。

次の入力行が利用できない場合、Nコマンド動詞はスクリプトの最後に分岐して新しいループを開始するか、パターンスペースを標準出力にコピーせずに終了する必要があります。

ベストアンサー1

このファイルをどのように作成しましたか?これには、1つではなく2つの改行文字が含まれています。もう一度お試しください

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

おすすめ記事