2009-10-18 5 views

Répondre

44

Essayez ceci: find /home/user/ -type f | xargs sed -i 's/a.example.com/b.example.com/g'

+0

Est-ce que cette remplacer la chaîne dans tous les fichiers sous le répertoire/home/utilisateur? Y compris les sous-répertoires? – Tony

+0

Oui, bien que vous deviez spécifier une sorte de modèle -nom 'modèle' après avoir trouvé – vehomzzz

+0

que voulez-vous dire "une sorte de modèle"? – Tony

4

Je sais que c'est une question très ancienne, mais ...

  1. @ réponse de vehomzzz utilise find et xargs lorsque les questions dit explicitement grep et sed seulement.

  2. @EmployedRussian et @BrooksMoses ont essayé de dire qu'il était un dup de awk et sed, mais pas - encore une fois, la question dit explicitement grep et sedseulement.

Voici donc ma solution, en supposant que vous utilisez Bash comme shell:

OLDIFS=$IFS 
IFS=$'\n' 
for f in `grep -rl a.example.com .` # Use -irl instead of -rl for case insensitive search 
do 
    sed -i 's/a\.example\.com/b.example.com/g' $f # Use /gi instead of /g for case insensitive search 
done 
IFS=$OLDIFS 

Si vous utilisez un autre shell, tels que SHell Unix, laissez-moi savoir et je vais essayer de trouver un ajustement de syntaxe.

P.S .: Voici un one-liner:

OLDIFS=$IFS;IFS=$'\n';for f in `grep -rl a.example.com .`;do sed -i 's/a\.example\.com/b.example.com/g' $f;done;IFS=$OLDIFS 

Sources:

1

Essayez cette commande:

/home/user/ directory - find ./ -type f \ 
-exec sed -i -e 's/a.example.com/b.example.com/g' {} \; 
+3

Bonjour. S'il vous plaît ne pas simplement jeter le code comme une réponse. Expliquez ce que vous faites pour que les utilisateurs puissent comprendre comment résoudre le problème. À votre santé. – Cthulhu

9

Essayez ceci:

grep -rl 'SearchString' ./ | xargs sed -i 's/REPLACESTRING/WITHTHIS/g' 

grep -rl recherchera récursivement le SEARCHSTRING dans les répertoires ./ et remplacera les chaînes en utilisant sed.

Ex:

Remplacement d'un nom TOM avec JERRY en utilisant la chaîne de recherche comme SWATKATS dans le répertoire CARTOONNETWORK

grep -rl 'SWATKATS' CARTOONNETWORK/ | xargs sed -i 's/TOM/JERRY/g' 

Cela remplacera TOM avec JERRY dans tous les fichiers et les sous-répertoires CARTOONNETWORK où il trouve la chaîne SWATKATS.

+0

Merci pour cette réponse, et comment écrire d'autres fichiers pour ne pas faire d'erreur? – Marine1

0

La commande ci-dessous recherche tous les fichiers récursive dont le nom correspond au modèle de recherche et remplacera la chaîne:

find /path/to/searchdir/ -name "serachpatter" -type f | xargs sed -i 's/stringone/StrIngTwo/g'

Aussi, si vous voulez limiter la profondeur de récursivité vous pouvez mettre les limites que bien:

find /path/to/searchdir/ -name "serachpatter" -type f -maxdepth 4 -mindepth 2 | xargs sed -i 's/stringone/StrIngTwo/g'

+0

find/chemin/vers/searchdir/-name "serachpatter" -type f -maxdepth 4 -mindepth 2 | xargs sed -i 's/stringone/StrIngTwo/g' – Akplive139

+0

À l'avenir, veuillez éditer votre réponse au lieu de poster un commentaire en-dessous. Aussi, veuillez mettre en forme le code approprié; N'utilisez pas de texte au format gras pour le code. –