2009-08-13 12 views
1

J'essaie d'écrire un script shell qui effectue une recherche et un remplacement dans un fichier de configuration au démarrage.Comment rechercher et remplacer du texte dans un fichier à partir d'un script shell?

La chaîne que nous essayons de remplacer est:

include /etc/nginx/https.include; 

et nous voulons le remplacer par une version commentée:

#include /etc/nginx/https.include; 

Le fichier qui contient la chaîne que nous voulons remplacer est:

/etc/nginx/app-servers.include 

Je ne suis pas un gourou Linux et n'arrive pas à trouver la commande pour le faire.

+0

Ceci est vraiment plus approprié à serverfault.com, à mon humble avis. –

+0

Je ne vois pas pourquoi cela est approprié pour serverfault.Cela ne semble pas avoir de rapport avec les serveurs. Il appartient au super-utilisateur. Voter pour fermer en tant que tel. – rmeador

+0

/bin/sh ou bash ou csh ou tout autre shell sont des langages complets Turing. Pourquoi ne pensez-vous pas que "Comment atteindre X dans la langue Y?" appartient à StackOverflow? – dmckee

Répondre

7
perl -p -i -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

Si la ligne ne pourrait pas finir dans le ;, utilisez plutôt:

perl -p -i -e 's%^(include /etc/nginx/https.include;.*)$%#$1%' /etc/nginx/ap-servers.include 

Si vous voulez conserver le fichier d'origine, ajoutez une extension de sauvegarde après -i:

perl -p -i.bak -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

Maintenant, en expliquant. Le drapeau -p signifie remplacer en place. Toutes les lignes du fichier seront ajoutées à l'expression et le résultat sera utilisé comme remplacement. L'indicateur -i indique l'extension du fichier de sauvegarde. En l'utilisant sans rien, vous évitez la génération de sauvegardes. Le -e indique à Perl d'obtenir le paramètre suivant en tant qu'expression à exécuter. L'expression est maintenant s%something%other%. J'utilise % au lieu du / plus traditionnel pour éviter d'avoir à échapper aux barres obliques du chemin. J'utilise des parenthèses dans l'expression et $1 dans l'expression substituée pour la sécurité - si vous changez un, l'autre suivra. Ainsi, %#$1% est en fait le deuxième % de s, suivi du #, désiré indiquant le motif entre parenthèses, et le dernier % de s.

HTH. MAIN.

+0

+1 pour la solution et pour utiliser un autre meilleur caractère pour ce cas (%) au lieu du plus traditionnel / –

2

Check out sed:

sed -i -r 's|^(include /etc/nginx/https.include;)$|#\1|' /etc/nginx/app-servers.include 

-i moyens faire la substitution en place et -r signifie d'utiliser des expressions régulières étendues.

0
cd pathname 
for y in `ls *`; 
do sed "s/ABCD/DCBA/g" $y > temp; mv temp $y; 
done 

Ce script shold remplacer la chaîne ABCD à DRASA dans tous les fichiers dans pathname

3

sed -i 's/foo/bar/g' config.txt

Cette remplace toutes les instances de foo (insensible à la casse) avec la barre dans le fichier config.txt

Questions connexes