Não entendi o comando 'n' do sed

3

Estou lendo sed & awk book e achei que entendi o comando n de sed até que executei o seguinte:

$ echo -ne "abc\ncde\nfg\n" | sed "/c/{
n
/f/d
}"

Saída:

abc
cde
fg

Mas eu esperava que a linha fg fosse excluída.

Meu entendimento do processo:

  • c corresponde à linha cde , a próxima linha é fg e deve ser excluída pelo comando /f/d , pois é correspondida por f .

Eu estava tão certo de que entendi este comando e é simples. Especialmente porque os autores escrevem que os comandos de letras maiúsculas N,D,P são mais difíceis e se você os entende, então você entende os comandos minúsculos de qualquer maneira. Mas eu não tenho dificuldades com o comando N .

    
por ka3ak 22.07.2016 / 10:37

2 respostas

2

Depois de ler o comentário de @don_crissti, eu entendo como o comando n afeta o controle de fluxo de sed .

n exclui a linha de leitura (ou próxima) da análise ..."/c/{... no próximo ciclo. Portanto, se usar n 2 vezes no meu exemplo, abc será correspondido, então cde será lido e, em seguida, fg será lido e excluído.

$ echo -ne "abc\ncde\nfg\n" | sed "/c/{
n
n
/f/d
}"

Saída:

abc
cde
    
por 22.07.2016 / 12:22
6

O problema, sua linha fg nunca é correspondida pelo padrão /f/ .

A primeira linha abc corresponde a /c/ , então os comandos dentro do bloco são executados.

  • O comando n imprime o espaço de padrão atual, que é abc e substitui o espaço de padrão pela próxima linha de entrada, que é cde .

  • cde não corresponde a /f/ , então não foi d eleted e foi impresso como padrão.

Agora, a próxima linha de entrada é fg foi lida, não corresponde a /c/ , então o bloco de código não foi executado.

Você pode verificar usando o comando l ook:

echo -ne "abc\ncde\nfg\n" | sed -n "l;/c/{
n
/f/d
}"

saídas:

abc$
fg$

A adição do comando l ook no início do script informa quais linhas de entrada foram processadas fora do bloco de códigos.

    
por 22.07.2016 / 10:52

Tags