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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top