Por que a inconsistência com o uso do cat vs echo foi canalizada para este comando sed?

2

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

    
por slm 16.08.2013 / 15:13

2 respostas

2

O padrão POSIX afirma:

[2addr] N Append the next line of input, less its terminating <newline>, to the pattern space, using an embedded <newline> to separate the appended material from the original material. Note that the current line number changes. 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.

, então o comportamento é muito diferente se houver ou não uma próxima linha.

Sua entrada, como você pode ver na saída de od -x , difere apenas em uma nova linha.

    
por 16.08.2013 / 15:30
3

Como você criou o arquivo? Ele contém duas novas linhas, não uma. Tente novamente com

echo abc > abc.txt
cat abc.txt | sed -n 'N;p'
    
por 16.08.2013 / 15:27