Existe-t-il un moyen d'exécuter une recherche récursive d'essai et de remplacer using sed
, avant de l'exécuter réellement? Je veux juste imprimer les résultats avant de faire la recherche et le remplacement. Quelque chose comme faire écho aux résultats de,
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
Réponses:
Vous pouvez exécuter
sed
sans-i
et parcourir la sortie avecless
Ensuite, exécutez
sed
avec-i.bak
pour créer des sauvegardes que vous pourrez ensuite différencierModifier: comme suggéré dans le commentaire, utilisez
grep --null | xargs -0
. Cela provoque la fin des noms de fichiers par l'octet nul, ce qui le rend sûr pour les noms de fichiers avec des caractères inhabituels comme la nouvelle ligne. Oui,\n
est un caractère valide dans un nom de fichier Unix. Les seuls caractères interdits sont le slash/
et le caractère nul\0
la source
grep -rl --null
car OP ne spécifiait pas OS, et-Z
signifie quelque chose de différent sur BSD / OSX (décompresser).--null
est le même sur GNU et BSDgrep
c'est (un fork de) le grep GNU sur FreeBSD et NetBSD. Sur NetBSD,-Z
signifie toujours--null
(selon la page de manuel), mais je suis d'accord - null est plus portable. A noter également que ni - nul ni -Z ne travaille sur OpenBSDsed -i '' -e s/.../
en BSDsed
(pas d'options optionnelles là-bas)Utiliser
sed
avecfind
au lieu degrep
Tout d'abord, j'emploierais
find
plutôt quegrep
, et ce pour trois bonnes raisons:find
permet une sélection plus précise des fichiers. Par exemple,grep -r string *.txt
ne produira des fichiers que dans le répertoire courant; pas ceux des sous-répertoires.find
est livré avec la puissante-exec
option qui élimine le besoin de la--null … |xargs 0
construction entière .-readable
et-writable
defind
permettront d'éviter de perdre du temps sur des fichiers inaccessibles.Test de capture
Cela dit,
grep
cela se prête à un premier test pour voir ce qui serait capturé:ou plus précisément:
Marche à sec
Maintenant, procédez à un
sed
essai à sec. L'sed
option-n
est synonyme de--quiet
et toutp
à la fin de l'sed
expression imprimera l'espace de motif actuel.ou plus précisément:
Exécution
Si tout semble correct, lancez la commande définitive en remplaçant l'
sed
option-n
par-i
pour "en place" et en supprimant lep
à la fin.ou plus précisément:
Plus d'
find
exemplesPlus d'
find
exemples peuvent être trouvés ici .la source