そこにあるテキストは少し誤解を招くものです。
2の出力レコードサイズを要求したので、それはまさにあなたが得ているものです。改行は、出力レコードサイズをまだ超えていない場合にのみスペースに置き換えられます。
私は次のようなことを言う方が良いと思います:
入力の各行について、「cbs」バイトを出力し、必要に応じて入力改行を十分なスペースに置き換えます。
私は当初、ドキュメントは次の行に沿って、コードで行われた方法を単に反映しているのではないかと考えていました。
- すべての行に対して:
- 最後の改行をスペースに置き換えます。
- 必要なレコード長にパッドにスペースを追加します。
- 目的のレコード長に切り捨てます。
しかし、実際にはそうではありません。最新のdd
ソースコードにはこれがあります(私自身のコメントも追加されています):
/* Copy NREAD bytes of BUF, doing conv=block
(pad newline-terminated records to `conversion_blocksize',
replacing the newline with trailing spaces). */
static void copy_with_block (char const *buf, size_t nread) {
size_t i;
// For every single character in input buffer.
for (i = nread; i; i--, buf++) {
// If we find a newline.
if (*buf == newline_character) {
// If output record no filled up, pad with spaces.
if (col < conversion_blocksize) {
size_t j;
for (j = col; j < conversion_blocksize; j++)
output_char (space_character);
}
// Regardless, start new output record.
col = 0;
} else {
// No newline.
// If we hit output limit, increment truncated-lines count.
// Otherwise only output character if under limit.
if (col == conversion_blocksize)
r_truncate++;
else
if (col < conversion_blocksize)
output_char (*buf);
// Regardless, increment characters-on-this-line count.
col++;
}
}
}
col
ここでは、グローバルを使用して出力列を格納するために、一度に1文字ずつ明確に処理しています。入力ストリームで改行が見つかるとすぐに、変換ブロックサイズまでのスペースに置き換えられることを明確に示しています。
また、変換ブロックサイズに達する前に改行が見つからない場合は、次の改行まで、他のすべての文字が単純に破棄されます。