Inspirado por esta pergunta: sed: o comando N não ler linha única Eu queria entender por que parece haver uma inconsistência entre os dois comandos a seguir:
# 1. echo
Este comando não produz saída
$ echo -en 'abc\n' | sed -n 'N;p'
$
Um dump hexadecimal da saída de echo
:
od - octal despejo
$ 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
Se eu colocar a string 'abc \ n' em um arquivo como este:
1: abc
2:
Essa é uma linha com a string abc
seguida por um avanço de linha ( \n
aka. 0x0A
). Em seguida, canalize-o para sed
como antes, recebo isto:
$ cat abc.txt | sed -n 'N;p'
abc
$
Essa saída inclui a string abc
seguida de 2 linefeeds.
od - octal despejo
$ 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
Estou um pouco perplexo com o que está acontecendo?
UPDATE
OK, então o meu problema era como eu estava criando o arquivo abc.txt
como @choroba apontou . Eu estava criando o arquivo em vim
e não percebendo que estava adicionando 2 linefeeds. Quando habilitei a visibilidade de caracteres especiais, ficou um pouco mais óbvio:
:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<,
:set list
Agora, em vim
file abc.txt
ficou assim:
abc$
$
Se eu criar o arquivo como @choroba sugerido , o arquivo abc.txt
será exibido como esperado:
$ cat abc.txt | od -tx1
0000000 61 62 63 0a
0000004
E se comportou de maneira idêntica ao exemplo original echo
:
$ cat abc.txt | sed -n 'N;p'
$
Problema original
Meu problema original com o porquê sed -n 'N;p'
não estava exibindo nada foi respondido graças à resposta @enzotib . O bit do padrão POSIX é o que eu não estava percebendo:
If no next line of input is available, the N command verb shall branch
to the end of the script and quit without starting a new cycle or
copying the pattern space to standard output