¿Por qué la incoinheritance con el uso de cat vs. echo canalizado a este command sed?

Inspirado por esta pregunta: el command sed: N no lee una sola línea . Quería entender por qué parece haber una inconsistencia entre los 2 commands siguientes:

# 1. eco

Este command no produce salida

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

Un volcado hexadecimal de la salida del echo :

od – octal dump

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

hexdump

 $ echo -en 'abc\n' | hexdump -C 00000000 61 62 63 0a |abc.| 00000004 

# 2. gato

Si pongo la cadena 'abc \ n' en un file como este:

 1: abc 2: 

Esa es una línea con el abc cadena seguido de un salto de línea ( \n aka. 0x0A ). Luego póngalo en sed como antes, entiendo esto:

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

Esa es la salida que incluye la cadena abc seguida de 2 avances de línea.

od – octal dump

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

hexdump

 $ cat abc.txt | hexdump -C 00000000 61 62 63 0a 0a |abc..| 00000005 

Estoy un poco perplejo sobre lo que está pasando?

ACTUALIZAR

De acuerdo, mi problema era cómo estaba creando el file abc.txt como señaló @choroba . Estaba creando el file en vim y sin darme count de que estaba agregando 2 avances de línea. Cuando habilité la visibilidad de los caracteres especiales, se volvió un poco más obvio:

 :set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<, :set list 

Ahora en el file vim abc.txt veía así:

 abc$ $ 

Si creé el file como lo sugirió @choroba, entonces el file abc.txt apareció como se esperaba:

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

Y se comportó de manera idéntica al ejemplo del echo original:

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

Problema original

Mi problema original con por qué sed -n 'N;p' no mostraba nada fue respondido gracias a la respuesta de @enzotib . El bit del estándar POSIX es lo que no estaba recogiendo:

Si no está disponible la próxima línea de input, el verbo N command se ramificará hasta el final del script y saldrá sin iniciar un nuevo ciclo o copyndo el espacio del patrón a la salida estándar.

El estándar POSIX establece:

[2addr] N Añada la siguiente línea de input, less su <newline> de terminación, al espacio del patrón, utilizando una <newline> incrustada para separar el material adjunto del material original. Tenga en count que el número de línea actual cambia. Si no está disponible la siguiente línea de input, el verbo N command se ramificará hasta el final del script y saldrá sin iniciar un nuevo ciclo o copyndo el espacio del patrón a la salida estándar .

entonces el comportamiento es muy diferente si hay o no una próxima línea.

Su input, como puede ver en la salida de od -x , difiere solo en una nueva línea.

¿Cómo se creó el file? Contiene dos nuevas líneas, no una. Intenta nuevamente con

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