2010-08-09 4 views
0

HIscript shell pour le remplacement des jetons dans tous les fichiers dans un dossier

Je ne suis pas très bon avec shell linux scripting.I essaie script suivant shell pour remplacer

numéro de révision jeton $rev -<rev number> dans tous les fichiers html sous répertoire spécifié

cd /home/myapp/test 
set repUpRev = "`svnversion`" 
echo $repUpRev 
grep -lr -e '\$rev -'.$repUpRev.'\$' *.html | xargs sed -i 's/'\$rev -'.$repUpRev.'\$'/'\$rev -.*$'/g' 

Cela ne semble pas fonctionner, quel est le problème avec le code ci-dessus?

+0

Quelle coque utilisez-vous? Quand vous dites seulement "ne pas travailler", ce n'est pas très utile. S'il vous plaît soyez précis concernant les messages d'erreur ou comment le comportement diffère de ce que vous attendez. –

Répondre

1
rev=$(svnversion) 
sed -i.bak "s/$rev/some other string/g" *.html 
0

Qu'est-ce que $ rev dans la chaîne regexp? Est-ce une autre variable? Ou vous cherchez une chaîne '$ rev'. Si ce dernier - je suggère d'ajouter « \ » avant $ sinon il est traité comme un caractère spécial ... regexp

+0

J'ai mis à jour le code selon votre commentaire mais il dit "sed: aucun fichier d'entrée " – Sourabh

0

Voici comment vous montrer la dernière ligne:

grep -lr -e '\$rev -'.$repUpRev.'\$' *.html | xargs sed -i 's/'\$rev -'.$repUpRev.'\$'/'\$rev -.*$'/g' 

Il serait utile que vous avez montré des données d'entrée.

L'option -r rend la récursive grep. Cela signifie qu'il fonctionnera sur les fichiers dans le répertoire et ses sous-répertoires. Est-ce ce que vous avez l'intention?

Les points de vos codes grep et sed correspondent à n'importe quel caractère. Si vous voulez des points littéraux, vous devrez les échapper.

Le dernier signe dollar échappé des commandes grep et sed sera considéré comme un signe dollar littéral. Si vous voulez ancrer à la fin de la ligne, vous devez supprimer l'échappement. Le .* fonctionne uniquement comme une chaîne littérale sur le côté droit d'une commande seds. Si vous voulez inclure ce qui a été apparié sur le côté gauche, vous devez utiliser des groupes de capture. Le modificateur g de la commande s n'est nécessaire que si le motif apparaît plusieurs fois sur une ligne.

L'utilisation de guillemets, de guillemets, de guillemets, de guillemets est difficile à lire. Utilisez des guillemets doubles pour autoriser l'expansion des variables.

Essayez votre commande grep par elle-même sans les xargs et pour voir si elle produit une liste de fichiers.

Cela peut être plus proche de ce que vous voulez:

grep -lr -e "\$rev -.$repUpRev.$" *.html | xargs sed -i "s/\$rev -.$repUpRev.$/\$rev -REPLACEMENT_TEXT/g" 

mais vous aurez toujours besoin de déterminer si le modificateur g, les points, les signes dollar finaux, etc., sont ce que vous avez l'intention.

Questions connexes