it-swarm-es.tech

Agregar una línea de texto a varios archivos

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 [email protected]
        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>
10
gabe.

Algo como esto:

sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'

trabajos. Si desea repetir este comando en muchos archivos, puede hacer algo como:

for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done

Probablemente mejor (pero no probado) gracias a @ChrisDown:

find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\ 
done
10
lcipriani

Si no te importa Perl, prueba:

Perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

Los -i cambiará su archivo antiguo con un .old extensión e imprimir a la actual.

2
gvkv

También puede usar "ex" (línea de comandos 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:

for FILENAME in *.whatever  # Need a criteria to glob, or a list of names
do
    ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done

Este enfoque le brinda las ventajas de "ex": encontrar una ubicación con patrones elaboarte 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 hacer inserciones. O puede cambiar entre rangos. No olvide que "ex" le permite usar "". como la línea actual, entonces.,/^ somepatter/s/blah/foo/funcionará.

2
Bruce Ediger

Puede usar el siguiente código de una sola línea 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 del 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 reemplazo, de lo contrario lo perderemos.

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
0
Oufie