J'essaie d'ajouter un en-tête de licence à tous les fichiers d'en-tête et fichiers source dans un répertoire de projet à l'aide d'une boucle for. Cela ne fonctionne pas, existe-t-il une autre approche sed
?
text-processing
shell-script
Satyendra
la source
la source
Réponses:
la source
globstar
en bash pour que cela fonctionne.Il s'agit plus ou moins d'un long commentaire sur la réponse de Daniel Serodio . J'ai commencé à l'écrire comme un commentaire, mais il est rapidement devenu trop grand ...
Pour qu'un glob bash soit récursif, il faut
shopt -s globstar
. Vous devez activer globstar, sinon**
cela ne fonctionne pas. L'option shell globstar a été introduite dans la version 4 de bash.Pour éviter de traiter un répertoire tel que
my.cpp/
, utilisez le test[[ -f $f ]]
... Lorsque le test est entre crochets doubles, les variables n'ont pas besoin d'être mises entre guillemets.Vous pouvez également envisager la possibilité qu'il n'y ait aucun fichier correspondant en utilisant
shopt -s nullglob
, ce qui permet aux modèles qui ne correspondent à aucun fichier de se développer en une chaîne nulle, plutôt qu'eux-mêmes.Pour gérer plusieurs modèles, vous pouvez enchaîner les modèles glob:
**/*.cpp **/*.h
, mais peut - être de préférence, lorsque l'option shell extglob est sur viashopt -s extglob
, vous pouvez utiliser ces constructions telles que ce**/*.@(cpp|h)
qui évite plusieurs passages sur le système de fichiers; une fois pour chaque motif.Si vous voulez
.files
être inclus, utilisez.*.cpp
etc, ou utilisezshopt -s dotglob
Pour gérer en toute sécurité la modification d'un fichier en cours de piping, utilisez
sponge
from packagemoreutils
(cela vous évite de créer votre propre fichier temporaire)la source
[[
peut gracieusement gérer un null$f
.unset x; [ -f $x ] && echo exists
**/*.@(cpp|h)
par$( find . -name "*.h" -name "*.cpp")
Merci @fred, @maxmackie, @enzotib.
Pouvez-vous s'il vous plaît vérifier la procédure que j'ai suivie.
sinon l'en-tête de licence sera copié plusieurs fois.
Veuillez me suggérer un modèle pour parcourir tous les en-têtes et sources du répertoire et des sous-répertoires du projet.
Je n'ai pas pu comprendre pleinement ce que @fred a suggéré.
la source
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... mais, bien sûr, au-delà de tout le reste, testez-le soigneusement en premier ... PS. C'est normal pour le cours ici à Unix et Linux de publier de tels extras dans votre question d'origine, pas comme réponse ...grep
, ajoutez l'-q
option àgrep
. Ajoutez toujours des guillemets$f
.Vous pouvez le faire avec
ex
oued
si vous préférez (vous ne devriez pas le faire avecsed
comme vous l'avez demandé,sed
est conçu pour modifier les flux,-i
est une mauvaise idée pour diverses raisons):la source
sed -i
une mauvaise idée?sed -i
rompt les liens symboliques et les liens physiques, ce qui entraîne un comportement inattendu. Au mieux, il n'est pas intuitif, au pire, il est activement nocif.Si vous en avez un
header_file
avec le contenu souhaité:la source
la source
Blog de Gerhard Gappmeier - Comment remplacer récursivement les en-têtes de fichiers des fichiers source
Le billet de blog a joint un
tar.gz
fichier contenant les fichiers nécessaires.Il a un
header.template
fichier, où vous pouvez écrire un commentaire personnalisé, il peut s'étendre sur plusieurs lignes.Il a un
remove_header.awk
script qui remplace les en-têtes existants par le nouvel en-tête.Pour l'exécuter:
la source