Maneira portátil de remover a primeira linha do espaço padrão (quando várias linhas estão presentes)

3

Qual é a maneira portátil de excluir a primeira linha 1 do espaço padrão?
Com gnu sed eu posso fazer

s/[^\n]*\n//

mas, até onde eu sei, (usando \n em uma expressão de [] de parênteses) não é portátil.

Exemplo prático: aqui, sed imprime a última seção do arquivo, incluindo o delimitador via código portátil . Gostaria de remover a primeira linha do espaço de padrão para excluir o delimitador e fazer isso de maneira portátil. Com gnu sed , é simples:

sed 'H;/===/h;$!d;//d;x;s/[^\n]*\n//' infile

1: Obviamente, isso deve ser feito sem reiniciar o ciclo de comandos ...

    
por don_crissti 10.09.2018 / 13:10

3 respostas

2

Uma forma de portably fazer esse tipo de coisa é a seguinte:

sed -e '
   # ... assuming prev sed cmds made pattern space carry newline(s)
   y/\n_/_\n/     ;# exchange newlines with an underscore
   s/^[^_]*_//    ;# remove up till the first underscore, ummm newline
   y/\n_/_\n/     ;# revert the transformation
' 
    
por 11.09.2018 / 16:00
2

Eu não tenho um sed adequado para experimentar, mas você sempre pode fazer loops internos para testar e remover caracteres até chegar à nova linha:

sed 'H
/===/h
$!d
//d
x
{
   :rpt
   s/^\n//
   t done
   s/.//
   t rpt
}
:done
'

O segundo ramo de teste, t rpt , precisa ser um t em vez de um b para redefinir o sinalizador interno que diz que um s foi bem-sucedido desde a última leitura. Você não precisa do {} , eles são apenas para mostrar melhor o loop.

    
por 10.09.2018 / 15:26
1

Bobo, mas trabalhando:

sed 'h;G;s/\n/&&/;s/^\(.*\)\n\(.*\)\n$//'

O que é isso? Você dobra todo o conteúdo e substitui a primeira nova linha por duas novas linhas. Então você tem o mesmo conteúdo duas vezes, com uma nova linha adicional após a primeira linha. Com backreferences agora você pode identificar as diferentes partes.

Se você não quiser usar o buffer de retenção:

sed 's/.*/&&/;s/\n/&&/;s/^\(.*\)\n\(.*\)$//'

E não, eu não gosto disso. Se houver uma maneira de evitá-lo, evite-o.

    
por 10.09.2018 / 17:11

Tags