Rechercher et remplacer du texte dans plusieurs fichiers


84

Je veux savoir comment je peux trouver et remplacer un texte spécifique dans plusieurs fichiers, comme dans Notepad ++ dans le tutoriel lié.

par exemple: http://cybernetnews.com/find-replace-multiple-files/


Il n’aura pas d’interface graphique mais je vous prie de bien vouloir examiner sed (man sed). C'est l'éditeur de flux existant depuis le début d'UNIX.
Apolinsky

Réponses:


136

Ici, j’utilise sed pour remplacer chaque occurrence du mot "cybernetnews" par "cybernet" dans chaque fichier portant l’extension c dans le répertoire / home / user / directory /.

find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

Une variante plus générique dans laquelle vous effectuez une recherche récursive dans le répertoire d'exécution et ne travaillez que sur des fichiers normaux, lisibles et inscriptibles:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;

2
Voté pour cela parce que c'est une méthode
tellement

4
Elu parce que sed est le meilleur choix pour l’OMI, mais answer serait plus utile si vous expliquiez les éléments de la réponse (personnellement, je ne suis pas au courant et curieux du {} \
;;

5
@sequoiamcdowell Woo! J'ai manqué ça! Pardon. Les accolades signifient fondamentalement "pour chaque match" et le point-virgule échappé (\;) sert à empêcher la double analyse. Nous ne voulons pas que le shell compatible bourne et sed essaient d'analyser la commande, mais simplement sed.

@Christopher comment ça marche si le mot contient des espaces comme cyber net news? Comment puis-je convertir cela en cyber net?
Khurshid Alam

1
@KhurshidAlam Utilisez la classe de caractères avec le commutateur -e:sed -i -e "s/cyber\snet\snews/cyber net/g"

27

L'éditeur de flux, sed, est un utilitaire puissant pour ce type de travail. C'est mon premier choix. Toutefois, si vous souhaitez utiliser un éditeur de texte ordinaire utilisant une application native basée sur Ubuntu, je vous suggère de jeter un coup d'œil à Jedit. , Il est disponible dans les référentiels et peut être installé en tapant dans votre console:

sudo apt-get install jedit

Lancez jedit, cliquez sur l'élément de menu de recherche, dans la liste de menu, cliquez sur l'élément de recherche dans le répertoire. La boîte de dialogue ci-dessous s'affichera:

Boîte de dialogue Jedit Search In Folder

Ceci est similaire à celui de Notepad ++ et fait la même chose, je crois que c'est ce que vous voulez.


C'était parfait pour quand je cherchais une ligne entière de code et hésitais à échapper à chaque caractère de regex spécial si j'avais fait la même chose avec sed.
IQAndreas

vous pouvez remplacer des blocs de code (tels que html, javascript, etc.) en quelques secondes.
lepe

Cela ne fonctionne pas sur un grand nombre de fichiers. Après quelques heures, aucun remplacement n'a été effectué, alors que geany a mis quelques minutes à rechercher toutes les occurrences. Ce n'est peut-être pas une recherche et un remplacement efficaces, mais cela a bien réchauffé la pièce.
Mark Aroni

19

Regexxer est une autre option de l'interface graphique : regexxer capture d'écran


Fonctionne parfaitement (si vous connaissez déjà Regex), merci.
Ernest

1
Même si vous ne connaissez pas les expressions rationnelles, vous pouvez utiliser cet outil comme un simple outil de recherche et de remplacement de chaîne.
Mohd Abdul Mujib

13
perl -pi -e 's/oldtext/newtext/g' *

remplace toute occurrence de oldtext par newtext dans tous les fichiers du dossier en cours. Cependant, vous devrez échapper à tous les caractères spéciaux Perl dans oldtext et newtext en utilisant la barre oblique inverse.


9

Vérifiez auprès de Geany , il s’agit du remplacement parfait de NPP pour Linux. Vous pouvez faire exactement cela, plus vous pouvez utiliser regex.


J'aime Geany! C'est mon éditeur préféré et il est assez puissant.
Pisu

1
Autant que je sache, Geany 1.23.1 (packagé avec Ubuntu 13.10) permet de rechercher plusieurs fichiers à l'aide de regex, sans les remplacer.
Drew Noakes

Vous pouvez rechercher et remplacer dans Geany plusieurs fichiers si vous les ouvrez tous, puis utilisez le bouton "en session" de la boîte de dialogue Rechercher / Remplacer.
MV.

1
Comment ouvrez-vous 5000 fichiers listés dans l'onglet messages?
Mark Aroni

1
Ok, le regexxer était à peu près ce que je demandais, je l'avais simplement sauté plus tôt en raison de son nom ayant regex et j'ai tendance à éviter tout ce qui a trait à regex. Mais je me suis trompé, cet outil a exactement ce qu'il faut pour rechercher et remplacer.
Mohd Abdul Mujib


2

Vous pouvez utiliser ce script, copier du code et créer un fichier find_and_replace_in_files.sh.

Je l'ai un peu modifié; s'il vous plaît dites-moi votre opinion.

# *****************************************************************************************
# find_and_replace_in_files.sh
# This script does a recursive, case sensitive directory search and replace of files
# To make a case insensitive search replace, use the -i switch in the grep call
# uses a startdirectory parameter so that you can run it outside of specified directory - else this script will modify itself!
# *****************************************************************************************

!/bin/bash
# **************** Change Variables Here ************
startdirectory="/your/start/directory"
searchterm="test"
replaceterm="test=ok!"
# **********************************************************

echo "***************************************************"
echo "* Search and Replace in Files Version 01-Aug-2012 *"
echo "***************************************************"

i=0; 

  for file in $(grep -l -R $searchterm $startdirectory)
    do
      cp $file $file.bak
      sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
      mv tempfile.tmp $file

    let i++;

      echo "Modified: " $file
    done

echo " *** All Done! *** Modified files:" $i

2

Searchmonkey est un autre programme .

SearchMonkey est une application Gtk légère qui vise à remplacer le fastidieux find / grep par une interface utilisateur épurée qui fournit rapidement une annotation indiquant les emplacements et le nombre de correspondances de texte. L'objectif est de fournir un outil de recherche simple à utiliser et accessible aux utilisateurs finaux et aux développeurs de logiciels.


2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

travaille pour moi sur fedora


Vous pouvez ajouter une ligne expliquant comment cela s’améliore par rapport à askubuntu.com/a/84013/158442
muru, le

@muru Il fonctionne beaucoup moins d' sedinstances! C'est donc beaucoup plus rapide en termes de temps de calcul. Le temps d’accès aux fichiers étant limité, je pense que le temps d’horloge n’est pas beaucoup plus rapide, mais que la charge du système est réduite. Note xargsmettra beaucoup, comme des centaines, de noms de fichiers sur la ligne de commande d'une seule sedcommande - en remplissant la taille de la mémoire tampon disponible en fonction de la longueur des chemins.
Volker Siegel le

Hmm ... si ça se ferme, je pourrais le remplacer par un qui explique clairement pourquoi c'est meilleur que celui qui a le droit de vote.
Volker Siegel le

@VolkerSiegel qui peut être réalisé avec +au lieu de \;dans find, non?
muru

1
@muru Probablement ... Mon "outil idéal pour le travail" - l'instinct préfère clairement xargs, mais vous avez raison; de man find: -exec command {} +... The command line is built in much the same way that xargs.... Cela me fait penser aux lignes de commande de git filter-branch...;)
Volker Siegel,

2

Une solution très simple: remplacez dans tous les *.txtfichiers du dossier string_1par string_2:

sed -i 's/string_1/string_2/g' *.txt

Très bonne réponse! Juste quelques ajouts. Si vous voulez remplacer récursivement une chaîne dans n'importe quel fichier du répertoire actuel, essayez ceci:sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
drugan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.