Como editar a próxima linha após padrão usando sed?

2

Usando sed , como pesquiso uma linha que termina com foo e edite a próxima linha se começar com #bar ?

Ou, em outras palavras, quero remover um comentário # da próxima linha se começar com #bar e a linha anterior terminar em foo .

Por exemplo:

This is a line ending in foo
#bar is commented out
There are many lines ending in foo
#bar commented out again

Eu tentei:

sed -i 's/^foo\n#bar/foo\nbar/' infile
    
por CompSci-PVT 24.05.2016 / 15:38

3 respostas

3

Use o ciclo N;P;D e tente substituir cada vez:

sed '$!N;s/\(foo\n\)#\(bar\)//;P;D' infile

isso remove o primeiro # de #bar apenas se seguir uma linha que termina em foo , caso contrário, apenas imprime o espaço padrão não modificado.

Aparentemente , você Deseja descomentar os espelhos dos EUA em /etc/pacman.d/mirrorlist , o que é uma coisa totalmente diferente:

sed -e '/United States/,/^$/{//!s/^#//' -e '}' /etc/pacman.d/mirrorlist

Isso removerá o comentário de todos os espelhos da seção dos EUA em /etc/pacman.d/mirrorlist

    
por 24.05.2016 / 15:45
1

Tente:

sed -e '$!N;/foo\n#bar/s/\(\n\)#//;P;D'
    
por 24.05.2016 / 15:40
1
sed '/foo$/{n;s/^#bar/bar/;}'

é uma tradução literal de sua exigência. n é para next .

Agora, isso não funciona em casos como:

line1 foo
#bar line2 foo
#bar

Ou:

line1 foo
line2 foo
#bar

Que você poderia abordar fazendo:

sed '
  :1
  /foo$/ {
     n
     s/^#bar/bar/
     b1
  }'
    
por 24.05.2016 / 16:58

Tags