Bash script para editar un montón de archivos
-
06-07-2019 - |
Pregunta
Para procesar un montón de datos y prepararlo para insertarlo en nuestra base de datos, generamos un montón de scripts de shell. Cada uno de ellos tiene aproximadamente 15 líneas, una para cada tabla a la que van los datos. Un lote de importación reciente, algunos de los archivos de importación fallaron al entrar en una tabla en particular. Entonces, tengo un montón de scripts de shell (alrededor de 600) donde necesito comentar las primeras 7 líneas, luego volver a ejecutar el archivo. Hay alrededor de 6000 scripts de shell en esta carpeta, y nada sobre un archivo en particular puede decirme si necesita la edición. Tengo una lista de los archivos que extraje de la salida de la base de datos.
Entonces, ¿cómo escribo un script bash (o cualquier otra cosa que funcione mejor) para tomar esta lista de nombres de archivos y para cada uno de ellos, comentar las primeras 7 líneas y ejecutar el script?
EDITAR:
#!/usr/bin/env sh
cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8
No estoy seguro de lo legible que es eso. Básicamente, las primeras 7 líneas (sin contar la primera línea) necesitan tener un # agregado al comienzo de ellas. Nota: los archivos se han editado para acortar cada línea y cortar parcialmente la copia de VIM. Pero en la parte principal de cada archivo, hay una línea que comienza con echo, luego una línea que comienza con sqlldr
Solución
Usando sed, puede especificar un rango de número de línea en el archivo que se va a cambiar.
#!/bin/bash
while read line
do
# add a comment to beginning of lines 1 - 7 and rename the script
sed '3,9 s/^/#/' $line > $line.new
exec $line.new
done < "filelist.txt"
Es posible que desee probar esto antes de ejecutarlo en todos esos scripts ...
EDITAR: cambió los números de las líneas para reflejar los comentarios.
Otros consejos
Hablando en términos generales:
#!/bin/sh
for file in "$@"
do
out=/tmp/$file.$
sed '2,8s/^/#/' < $file > $out
$SHELL $out
rm -f $out
done
Suponiendo que no te importa comprobar las condiciones de carrera, etc.
ex parece hecho para lo que quieres hacer.
Por ejemplo, para editar un archivo, con un documento aquí:
#!/bin/sh
ex test.txt << END
1,12s/^/#/
wq
END
Eso comentará las primeras 12 líneas en " test.txt " ;. Para su ejemplo, puede probar " $ FILE "
o similar (¡incluyendo comillas!).
Luego ejecútelos de la forma habitual, es decir, ./"$FILE"
editar: $ SHELL " $ FILE "
es probablemente un mejor enfoque para ejecutarlos (desde uno de los comentaristas anteriores).
Finalmente, querrás usar el comando linux sed. Cualquier lógica que necesite colocar en el guión, ya lo sabe. Pero su script finalmente llamará sed. http://lowfatlinux.com/linux-sed.html