J'utilise egrep -R
suivi d'une expression régulière contenant environ 10 unions, donc comme:
.jpg | .png | .gif
etc. Cela fonctionne bien, maintenant je voudrais remplacer toutes les chaînes trouvées par.bmp
Je pensais à quelque chose comme
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
donc le problème ici est de savoir comment faire une expression régulière d'union similaire dans sed
et comment lui dire d'enregistrer les modifications dans le fichier dont il a obtenu l'entrée.
Réponses:
Utilisez cette commande:
egrep
: trouver les lignes correspondantes à l'aide d'expressions régulières étendues-l
: liste uniquement les noms de fichiers correspondants-R
: recherche récursivement dans tous les répertoires donnés-Z
: utiliser\0
comme séparateur d'enregistrement"\.jpg|\.png|\.gif"
: correspond à l'une des chaînes".jpg"
,".gif"
ou".png"
.
: lancer la recherche dans le répertoire courantxargs
: exécuter une commande avec le stdin comme argument-0
: utiliser\0
comme séparateur d'enregistrement. Ceci est important pour faire correspondre le-Z
ofegrep
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 comme paramètresed
: Le s tream ed Itor-i
: remplacer le fichier d'entrée par la sortie sans faire de sauvegarde-e
: utilisez l'argument suivant comme expression's/\.jpg\|\.gif\|\.png/.bmp/g'
: remplace toutes les occurrences des chaînes".jpg"
,".gif"
ou".png"
par".bmp"
la source
sed -r
pour les expressions régulières étendues. À ce stade, le modèle correspondra à ce qui est utilisé dans egrep, et vous voudrez peut-être le mettre dans une variable pour le réutiliser.Honnêtement, tout comme j'aime sed pour les tâches appropriées, c'est définitivement une tâche pour perl - c'est vraiment plus puissant pour ce genre de one-liners, en particulier pour "l'écrire d'où il vient" (le
-i
commutateur de perl le fait pour vous, et vous permet également de conserver l'ancienne version, par exemple avec un .bak ajouté, utilisez simplement à la-i.bak
place).plutôt qu'un travail complexe dans sed (si même possible là-bas) ou awk ...
la source
sed
.. Je pense que j'ai oublié quelques indicateurs pour sed ou il avait des limites.Une autre façon de faire cela
Un peu d'aide concernant la commande ci-dessus
La recherche fera la recherche pour vous sur le répertoire courant indiqué par
.
-name
le nom du fichier dans mon cas, son pom.xml peut donner des jokers.-exec
exécutersed
éditeur de flux-i
ignorer la casses
est un substitut/4.6.0.../
Chaîne à rechercher/5.0.0.../
Chaîne à remplacerla source
Je n'ai pas réussi à faire fonctionner l'une des commandes de cette page: la solution sed a ajouté une nouvelle ligne à la fin de tous les fichiers qu'elle traitait, et la solution perl n'a pas pu accepter suffisamment d'arguments de find. J'ai trouvé cette solution qui fonctionne parfaitement:
Cela reviendra dans l'arborescence de répertoires actuelle et remplacera
search_regex
parreplacement_string
dans tous les fichiers se terminant par.h
ou.m
.J'ai également utilisé rpl à cette fin dans le passé.
la source
essayez quelque chose en utilisant une boucle for
pas joli, mais devrait faire.
la source
|while read i
modèle permettrait la diffusion en continu et éviterait les restrictions de longueur lorsque les résultats d'egrep deviennent trop longsMon cas d'utilisation était que je voulais remplacer
foo:/Drive_Letter
parfoo:/bar/baz/xyz
Dans mon cas, j'ai pu le faire avec le code suivant. J'étais dans le même emplacement de répertoire où il y avait beaucoup de fichiers.espérons que cela a aidé.
MISE À JOUR s | toto: / lettre_lecteur: | toto: / ba / baz / xyz | g
la source
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'