この質問からインスピレーションを得ました。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'
答え2
POSIX規格には次のように規定されている。
[2住所]窒素ソース素材から追加された素材を分離するには、埋め込み<newline>を使用して、次の入力行(終了<newline>を除く)をパターンスペースに追加します。現在の行番号が変更されます。次の入力行が利用できない場合、Nコマンド動詞はスクリプトの最後に分岐して新しいループを開始するか、パターンスペースを標準出力にコピーせずに終了する必要があります。。
したがって、次の行があるかどうかにかかわらず、動作は非常に異なります。
出力が示すように、od -x
入力は改行でのみ異なります。