Question Rechercher et remplacer du texte dans plusieurs fichiers


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

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


73
2017-11-30 13:58


origine


Il n'aura pas d'interface graphique mais je vous invite à examiner sed (man sed). C'est l'éditeur de flux existant depuis le lancement d'UNIX. - apolinsky


Réponses:


Ici, j'utilise sed pour remplacer chaque occurrence du mot "cybernetnews" par "cybernet" dans chaque fichier avec 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 où vous effectuez une recherche récursive à partir du répertoire d’exécution et opérez uniquement sur des fichiers réguliers, lisibles et inscriptibles:

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

124
2017-11-30 14:15



Voté pour cela parce que c'est une méthode si efficace - Sabacon
Voté parce que sed est le meilleur choix IMO, mais la réponse serait plus utile si vous expliquiez les composants de la réponse (personnellement, je ne suis pas familier avec le {} \;) - sequoia mcdowell
@sequoiamcdowell Woo! J'ai manqué ça! Pardon. Les accolades signifient essentiellement "pour chaque correspondance" et le point-virgule échappé (\;) est destiné à empêcher une double analyse. Nous ne voulons pas que le shell compatible bourne et sed essaient d’analyser la commande, juste 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
@KhurshidAlam Utilisez la classe de caractères avec le commutateur -e: sed -i -e "s/cyber\snet\snews/cyber net/g"


L'éditeur de flux, sed, est un utilitaire puissant pour ce type de travail et est mon premier choix, cependant, si vous voulez le faire à partir d'un éditeur de texte ordinaire utilisant une application native basée sur Ubuntu, je vous suggère de consulter 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 du menu, cliquez sur l'élément Rechercher dans l'annuaire. La boîte de dialogue suivante apparaîtra:

Jedit Search In Folder Dialog

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


26
2017-11-30 15:57



C'était parfait quand je cherchais une ligne entière de code et hésitais à échapper à chaque caractère spécial de regex si j'avais fait la même chose avec sed. - IQAndreas
vous pouvez remplacer les blocs de code (comme HTML, JavaScript, etc.) en quelques secondes. - lepe
Cela ne fonctionne pas sur un grand nombre de fichiers, après quelques heures, il n'y avait pas eu de remplacement, alors que geany a mis quelques minutes à trouver 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


Une autre option de l'interface graphique est regexxer: regexxer screenshot


17
2017-11-30 17:26



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


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.


13
2017-11-30 14:11





Vérifier avec Geany, c'est le remplacement parfait de NPP pour Linux. Vous pouvez faire exactement cela et vous pouvez utiliser regex.


9
2017-11-30 14:35



J'adore Geany! C'est mon éditeur préféré et il est assez puissant. - Pisu
Autant que je sache, Geany 1.23.1 (fourni avec Ubuntu 13.10) permet de rechercher plusieurs fichiers à l'aide de regex, sans toutefois les remplacer. - Drew Noakes
Vous pouvez rechercher et remplacer dans Geany plusieurs fichiers si vous les ouvrez tous, puis utilisez le bouton "En session" dans la boîte de dialogue Rechercher / Remplacer. - MV.
Comment ouvrez-vous 5000 fichiers répertoriés dans l'onglet Messages? - Mark Aroni


J'ai écrit un petit script pour cette chose. Si vous n'avez besoin que des bases et que vous ne connaissez pas sed, jetez un coup d’œil ici: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in-a-set-of-files/

Le script est le suivant:

for f in submit_*;
  do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
  mv a_$f $f ;
done

3
2017-12-02 02:09





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 avis.

# *****************************************************************************************
# 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
2017-08-01 15:36