101 votes

à l’aide de sed et grep pour rechercher et remplacer

J’utilise suivie d’une expression régulière contenant environ 10 syndicats, donc, comme : etc. Cela fonctionne bien, maintenant, je voudrais remplacer toutes les chaînes trouvées avec``

Je pensais à quelque chose comme

donc la question ici est comment faire une expression régulière union semblable `` et comment pour enregistrer les modifications dans le fichier qu’il a obtenu l’entrée de dire.

196voto

David Schmitt Points 29384

Utilisez cette commande:

egrep -lRZ "\.jpg|\.png|\.gif" . \
    | xargs -0 -l sed -i -e 's/\.jpg\|\.gif\|\.png/.bmp/g'
  • egrep: trouver la correspondance des lignes à l'aide d'expressions régulières étendues

    • -l: seule la comparaison avec la liste de noms de fichiers

    • -R: recherche récursive à travers tous les répertoires

    • -Z: utiliser \0 comme séparateur d'enregistrements

    • "\.jpg|\.png|\.gif": correspondre à l'une des cordes ".jpg", ".gif" ou ".png"

    • .: départ de la recherche dans le répertoire courant

  • xargs: exécuter une commande avec le stdin comme argument

    • -0: utiliser \0 comme séparateur d'enregistrements. C'est important de faire correspondre l' -Z de egrep et pour éviter d'être dupé par les espaces et les retours à la ligne dans les noms de fichiers d'entrée.

    • -l: utiliser une ligne par commande en paramètre

  • sed: le *s*tream *ed*itor

    • -i: remplacer le fichier d'entrée avec la sortie sans faire une sauvegarde

    • -e: utiliser l'argument suivant en tant qu'expression

    • 's/\.jpg\|\.gif\|\.png/.bmp/g': remplacer toutes les occurrences des cordes ".jpg", ".gif" ou ".png" avec ".bmp"

11voto

Alex Martelli Points 330805

Honnêtement, autant que j’aime sed pour les tâches appropriées, c’est certainement une tâche pour perl--il est vraiment plus puissant pour ce genre d’one-liners, notamment pour « écrire il revenir d'où il vient » (de perl interrupteur le fait pour vous et éventuellement aussi vous permet de garder l’ol d version autour par exemple avec un .bak annexée, il suffit d’utiliser à la place).

au lieu de travail complexe dans sed (si possible même là) ou awk...

11voto

Cyril Cherian Points 21

Une autre façon de le faire

find . -name *.xml -exec sed -i "s/4.6.0-SNAPSHOT/5.0.0-SNAPSHOT/" {} \;

Un peu d'aide concernant la commande ci-dessus

Les trouver va faire le trouver pour vous sur le répertoire en cours est indiqué par .

-name le nom du fichier dans mon cas sa pom.xml peut donner des cartes sauvages.

-exec execute

sed éditeur de flux

-i ignorer la casse

s est pour remplacer

/4.6.0.../ Chaîne de caractères à rechercher

/5.0.0.../ Chaîne de caractères à être remplacé

5voto

titaniumdecoy Points 7548

Je ne pouvais pas obtenir toutes les commandes sur cette page pour travailler pour moi: le sed solution a ajouté une nouvelle ligne à la fin de tous les dossiers qu'il a traités, et le perl solution a été incapable de l'accepter assez d'arguments de trouver. J'ai trouvé cette solution qui fonctionne parfaitement:

find . -type f -name '*.[hm]' -print0 
    | xargs -0 perl -pi -e 's/search_regex/replacement_string/g'

Ce répète en bas de l'arborescence actuelle et de la remplacer search_regex avec replacement_string dans tous les fichiers se terminant en .h ou .m.

J'ai également utilisé la rpl pour cela dans le passé.

0voto

Don Johe Points 549

essayez quelque chose en utilisant une boucle for

pas assez, mais devrait le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X