secuencia de comandos sed para insertar una línea después de la última línea coincidente en un archivo


3

Me gustaría escribir un script en sed para insertar una línea en un archivo después de todas las líneas similares en el archivo. Entonces necesito localizar la última coincidencia para un patrón e insertarlo inmediatamente después. Es muy poco probable que esta sea la última línea del archivo.

He visto una serie de soluciones que emplean múltiples llamadas canalizadas para sed o utilizan otras herramientas como tac. Estos no son apropiados: necesito una solución sed pura que pueda integrarse dentro de un script más grande que realice otros cambios en el mismo archivo.

He estado buscando durante un tiempo, pero sospecho que no es posible. ¡Pensé en preguntar aquí antes de rendirme!

En caso de que los detalles específicos ayuden a explicar, quiero ubicar la última directiva "Incluir" en un archivo Apache http.conf e insertar otra debajo de la última.


¿Puedes explicar qué tiene de malo usar tac (o simplemente awk, para el caso)? ¿por qué solo necesitas sed puro?
Philomath

Estaba tratando de lograr un script que pueda aplicar todos los cambios al archivo de una vez. Sí, podría hacer diferentes cambios de diferentes maneras, pero esperaba contener todas las alteraciones en un archivo en un script. No hay nada de malo en las combinaciones tac / awk / grep / sed: las he usado muchas veces. Para este problema en particular, quería obtener una única solución sed.
starfry

Al investigar encontré esto, pero nunca pude hacerlo funcionar: info.birnamdesigns.com/wiki/Sed_insert_after_last_match
starfry

Respuestas:


3

Técnicamente, el siguiente script (mínimamente probado) parece hacer lo que necesita. El principio es almacenar líneas en el espacio de espera; cuando includese encuentra una línea, imprima todas las líneas acumuladas y limpie el espacio de espera; al final de la entrada, anteponga newlas líneas acumuladas e imprima.

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

Es poco probable que se integre bien en un script sed existente. Realmente estás estirando las habilidades de sed allí.

Un archivo de configuración de Apache se adapta fácilmente a la memoria. No use un editor de transmisión, cárguelo en una herramienta decente como Perl o Python, o al menos awk.


Creo que tienes razón, esto está empujando a sus límites. Creo que es una herramienta maravillosa y me gusta ver qué puede hacer. Quizás, por una vez, no es la herramienta adecuada para el trabajo.
starfry

0

Probablemente haya una solución real en sedque alguien más intervendrá, pero hace mucho tiempo resolví el mismo escenario con este truco.

Coloqué un pequeño "marcador" de comentario en el punto en el archivo de configuración que quería que se insertara algo nuevo con un script. Decir:

#(Insert includes here)

Luego puede usar la búsqueda simple y reemplazarla con esa cadena como parámetro de búsqueda y reemplazarla con su nueva inclusión MÁS la línea de comentarios original.


Sí, probablemente haré algo así si no puedo obtener una solución completa basada en Sed. Esperemos que alguien va a llegar a esa solución real ...
starfry
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.