Vraag Zoek en vervang tekst binnen meerdere bestanden


Ik wil weten hoe ik een specifieke tekst in meerdere bestanden zoals in Notepad ++ kan vinden en vervangen in de gekoppelde zelfstudie.

bijv .: http://cybernetnews.com/find-replace-multiple-files/ 


73
2017-11-30 13:58


oorsprong


Het zal niet de grafische interface hebben, maar ik zou je willen aanmoedigen om sed (man sed) te onderzoeken. Het is de stream-editor die vanaf het begin van UNIX bestaat. - apolinsky


antwoorden:


Hier gebruik ik sed om elk voorkomen van het woord "cybernetnews" te vervangen door "cybernet" in elk bestand met de extensie, c, in de directory, / home / user / directory /.

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

Een meer generieke variant waarbij u recursief zoekt in de uitvoermap en alleen gewone, leesbare, beschrijfbare bestanden gebruikt:

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

124
2017-11-30 14:15



Gestemd omdat het zo'n efficiënte methode is - Sabacon
Verkozen omdat sed de beste IMO-keuze is, maar een antwoord zou nuttiger zijn als je de componenten van het antwoord uitlegde (persoonlijk ben ik niet bekend met en nieuwsgierig naar de {} \;) - sequoia mcdowell
@sequoiamcdowell Woo! Ik miste dit! Sorry. De accolades betekenen in principe "voor elke match" en de escaped puntkomma (\;) is om dubbele ontleding te voorkomen. We willen niet dat de bourne-compatibele shell en sed proberen het commando te ontleden, alleen sed.
@Christopher hoe werkt het als het woord spaties als bevat cyber net news? Hoe kan ik dit converteren naar cyber net? - Khurshid Alam
@KhurshidAlam Gebruik de tekenklasse met de schakeloptie -e: sed -i -e "s/cyber\snet\snews/cyber net/g"


De stream-editor, sed, is een krachtig hulpprogramma voor dit soort werk en is mijn eerste keuze, maar als je dit wilt doen vanuit een gewone teksteditor met een op Ubuntu gebaseerde native applicatie, raad ik je aan Jedit te bekijken , Het is beschikbaar in de repositories en kan worden geïnstalleerd door uw console in te typen:

sudo apt-get install jedit

Start jedit, klik op het menu-item zoeken, klik in de menulijst op het item Zoeken in map en het dialoogvenster hieronder wordt weergegeven:

Jedit Search In Folder Dialog

Dit is vergelijkbaar met dat van Notepad ++ en doet hetzelfde, ik geloof dat dit is wat je wilt.


26
2017-11-30 15:57



Dit was perfect voor toen ik op zoek was naar een hele regel code en aarzelde om aan elk regex-speciaal personage te ontsnappen als ik hetzelfde had gedaan met sed. - IQAndreas
je kunt codeblokken (zoals html, javascript, enz.) in seconden vervangen. - lepe
Dit werkt niet op een groot aantal bestanden, na een paar uur had het nog geen vervanging gemaakt, terwijl geany enkele minuten duurde om alle exemplaren te vinden. Dit is misschien geen efficiënte zoekopdracht en vervanging, maar het heeft de ruimte mooi opgewarmd. - Mark Aroni


Een andere GUI-optie is regexxer: regexxer screenshot


17
2017-11-30 17:26



Werkt perfect (als u al bekend bent met Regex), dank u. - Ernest


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

vervangt elk voorkomen van oude tekst door nieuwe tekst in alle bestanden in de huidige map. Je zult echter alle perl speciale tekens in oldtext en newtext moeten verlaten met behulp van de backslash.


13
2017-11-30 14:11





Controleer met Geany, het is een perfecte NPP-vervanging voor Linux. U kunt precies dat doen plus u kunt regex gebruiken.


9
2017-11-30 14:35



Ik houd van Geany! Het is mijn favoriete editor en is krachtig genoeg. - Pisu
Voor zover ik kan nagaan, kan Geany 1.23.1 (verpakt met Ubuntu 13.10) zoeken naar meerdere bestanden met behulp van regex, maar deze niet vervangen. - Drew Noakes
U kunt in Geany meerdere bestanden zoeken en vervangen als u ze allemaal opent en vervolgens de knop "in sessie" gebruikt in het dialoogvenster Zoeken / Vervangen. - MV.
Hoe open je 5000 bestanden die op het tabblad Berichten staan ​​vermeld? - Mark Aroni


Ik heb een klein script geschreven voor alleen dit ding. Als je alleen de basis nodig hebt en niet bekend bent met sed etc, kijk dan hier: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in-a-set-of-files/

Het script is de volgende:

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





U kunt dit script gebruiken, een code kopiëren en een bestand maken find_and_replace_in_files.sh.

Ik heb het een beetje aangepast; vertel me alsjeblieft wat je mening is.

# *****************************************************************************************
# 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