Entonces, tengo un montón de archivos en un directorio, y necesito insertar una línea de texto en cada uno de ellos. Tienen esencialmente el siguiente formato:
<VirtualHost *:80>
ServerAdmin gabe@localhost
DocumentRoot /var/www/test1
ServerName test1.local
ServerAlias test1
<Directory "/var/www/test1">
Options All
AllowOverride All
</Directory>
</VirtualHost>
Y me gustaría insertar una línea antes del cierre
</VirtualHost>etiqueta. Mi primera suposición es que debería poder hacer esto con sed, probablemente haciendo coincidir y reemplazando esa etiqueta. Voy a comenzar a intentar esto ahora, pero si alguien tiene una forma existente de hacerlo, me encantaría escucharlo.
text-processing
sed
gabe
fuente
fuente
Respuestas:
Algo como esto:
trabajos. Si desea repetir este comando en muchos archivos, puede hacer algo como:
Probablemente mejor (pero no probado) gracias a @ChrisDown:
fuente
/
de la expresión sed es más limpio, ya que no tiene que escapar de la barra:'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
Si no te importa Perl prueba:
El
-i
interruptor guardará su archivo anterior con una.old
extensión e imprimirá al actual.fuente
También puede usar "ex" (línea de comando vi) si la edición que desea hacer es incluso algo complicada. Por ejemplo, solo desea realizar la inserción en una instancia de "".
Un script de shell como este puede funcionar:
Este enfoque le brinda las ventajas de "ex": encontrar una ubicación con patrones elaborados y 'movimientos del cursor'. Puede hacer cosas como buscar un patrón, luego buscar la siguiente instancia, LUEGO hacer la inserción. O puede cambiar el texto, en lugar de simplemente insertar. O puede cambiar entre rangos. No olvides que "ex" te permite usar "." como la línea actual, entonces, / ^ somepatter / s / blah / foo / funcionará.
fuente
Puede usar el siguiente código de línea única para insertar una sola línea o varias líneas en una ubicación determinada en un archivo, en su caso antes de 'VirtualHost'. El código básicamente busca el nombre de archivo (podría ser *. *, Si desea insertar los textos en todos los archivos) dentro del directorio dado y sus subdirectorios. Dentro de los archivos encontrados, busca el patrón 'VirtualHost'. Después de encontrar el patrón, lo reemplaza con firstline \ nsecondline \ notherlines \ n \ VirtualHost. Tenga en cuenta que 'VirtualHost' es parte del texto para el reemplazo, de lo contrario lo perderemos.
fuente