sed para inserir linha após a última linha correspondente em um arquivo

3

Eu gostaria de escrever um script no sed para inserir uma linha em um arquivo depois de todas as linhas semelhantes no arquivo. Portanto, preciso localizar a última correspondência de um padrão e inseri-la imediatamente depois dela. É muito improvável que essa seja a última linha do arquivo.

Eu vi várias soluções que empregam várias chamadas encanadas para sed ou usam outras ferramentas, como tac. Estes não são apropriados - eu preciso de uma solução sed pura que possa ser incorporada em um script maior que faça outras alterações no mesmo arquivo.

Estou procurando há algum tempo, mas suspeito que não seja possível. Eu pensei em perguntar aqui antes de desistir!

No caso de especificações explicativas, quero localizar a última diretiva "Incluir" em um arquivo http.conf do Apache e inserir outra abaixo da última.

    
por starfry 22.07.2011 / 11:11

2 respostas

3

Tecnicamente, o script abaixo (minimamente testado) parece fazer o que você precisa. O princípio é armazenar linhas no espaço de espera; quando uma linha include for encontrada, imprima todas as linhas acumuladas e limpe o espaço de armazenamento; no final da entrada, adicione new às linhas acumuladas e imprima.

#n
H
$ {
  g
  s/^/new/
  p
  b
}
/include/ {
  g
  s/^\n//
  p
  s/.*//
  h
  b
}

É improvável que isso se integre bem a um script sed existente. Você está realmente esticando as habilidades de sed lá.

Um arquivo de configuração do Apache se adapta facilmente à memória. Não use um editor de streaming para isso, carregue-o em uma ferramenta decente como Perl ou Python, ou pelo menos awk.

    
por 22.07.2011 / 15:02
0

Provavelmente existe uma solução real em sed em que alguém mais participará, mas há muito tempo resolvi o mesmo cenário com esse hack.

Eu coloquei um pequeno comentário "marcador" no ponto no arquivo de configuração que eu queria inserir algo novo com um script. Diga:

#(Insert includes here)

Em seguida, você pode usar a pesquisa simples e substituir por essa string como o parâmetro de pesquisa e substituí-la por sua nova linha de comentário original PLUS PLUS.

    
por 22.07.2011 / 11:19

Tags