Script Bash pour éditer un tas de fichiers
-
06-07-2019 - |
Question
Pour traiter un groupe de données et le préparer à être inséré dans notre base de données, nous générons un ensemble de scripts shell. Chacune d’elles a environ 15 lignes, une pour chaque table où vont les données. Dans le cas d’un lot d’importation récent, certains fichiers d’importation ont échoué et ont été insérés dans une table particulière. Donc, j'ai un tas de scripts shell (environ 600) où je dois commenter les 7 premières lignes, puis réexécuter le fichier. Ce dossier contient environ 6000 scripts shell, et rien sur un fichier en particulier ne peut me dire s'il nécessite une modification. J'ai une liste des fichiers que j'ai extraits de la sortie de la base de données.
Alors, comment puis-je écrire un script bash (ou quelque chose d’autre qui fonctionnerait mieux) pour utiliser cette liste de noms de fichiers et pour chacune d’elles, commenter les 7 premières lignes et exécuter le script?
EDIT:
#!/usr/bin/env sh
cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8
Je ne sais pas si c'est lisible. Fondamentalement, les 7 premières lignes (sans compter la première ligne) doivent être complétées par un #. Remarque: les fichiers ont été modifiés de manière à raccourcir chaque ligne et à couper partiellement la copie de VIM. Mais dans la partie principale de chaque fichier, il y a une ligne commençant par echo, puis une ligne commençant par sqlldr
La solution
Avec sed, vous pouvez spécifier une plage de numéros de ligne dans le fichier à modifier.
#!/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"
Vous voudrez peut-être tester ceci avant de l'exécuter sur tous ces scripts ...
EDIT: modification du nombre de lignes pour refléter les commentaires.
Autres conseils
Grosso modo:
#!/bin/sh
for file in "$@"
do
out=/tmp/$file.$
sed '2,8s/^/#/' < $file > $out
$SHELL $out
rm -f $out
done
En supposant que vous ne vous souciez pas de vérifier les conditions de compétition, etc.
ex semble fait pour ce que vous voulez faire.
Par exemple, pour éditer un fichier, avec un document ici:
#!/bin/sh
ex test.txt << END
1,12s/^/#/
wq
END
Cela commentera les 12 premières lignes de "test.txt". Pour votre exemple, vous pouvez essayer " $ FILE &
ou similaire (avec des guillemets!).
Ensuite, exécutez-les comme d'habitude, c'est-à-dire ./" $ FILE "
modifier: $ SHELL "$ FILE"
est probablement une meilleure approche pour les exécuter (à partir de l'un des commentateurs ci-dessus).
En fin de compte, vous souhaiterez utiliser la commande linux sed. Quelle que soit la logique que vous devez placer dans le script, vous savez. Mais votre script appellera finalement sed. http://lowfatlinux.com/linux-sed.html