Suchen und Ersetzen von Text in mehreren Dateien

84

Ich möchte wissen, wie ich einen bestimmten Text in mehreren Dateien wie in Notepad ++ im verknüpften Lernprogramm finden und ersetzen kann.

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

Faruk Uzun
quelle
Es wird keine grafische Oberfläche geben, aber ich möchte Sie dringend bitten, sed (man sed) zu untersuchen. Es ist der Stream-Editor, der seit dem Start von UNIX existiert.
apolinsky

Antworten:

136

Hier benutze ich sed, um jedes Vorkommen des Wortes "cybernetnews" durch "cybernet" in jeder Datei mit der Erweiterung "c" im Verzeichnis "/ home / user / directory /" zu ersetzen.

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

Eine allgemeinere Variante, bei der Sie rekursiv aus dem Ausführungsverzeichnis suchen und nur mit regulären, lesbaren und beschreibbaren Dateien arbeiten:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
gregtczap
quelle
2
Dafür gestimmt, weil es eine so effiziente Methode ist
Sabacon
4
Gestimmt, weil sed die beste Wahl ist IMO, aber eine Antwort wäre nützlicher, wenn Sie die Bestandteile der Antwort erläutern würden (ich persönlich kenne die {} \;)
Sequoia mcdowell vom
5
@sequoiamcdowell Woo! Das habe ich verpasst! Es tut uns leid. Die geschweiften Klammern bedeuten im Grunde "für jede Übereinstimmung" und das Semikolon (\;) soll ein doppeltes Parsen verhindern. Wir wollen nicht, dass die bourne-kompatible Shell und sed versuchen, den Befehl zu analysieren, sondern nur sed.
@ Christopher Wie funktioniert es, wenn das Wort Leerzeichen enthält cyber net news? Wie kann ich das konvertieren cyber net?
Khurshid Alam
1
@ KhurshidAlam Verwenden Sie die Zeichenklasse mit der sed -i -e "s/cyber\snet\snews/cyber net/g"
27

Der Stream-Editor sed ist ein leistungsstarkes Dienstprogramm für diese Art von Arbeit und meine erste Wahl. Wenn Sie dies jedoch in einem normalen Texteditor mit einer Ubuntu-basierten nativen Anwendung tun möchten, sollten Sie sich Jedit ansehen , Es ist in den Repositorys verfügbar und kann installiert werden, indem Sie Folgendes in Ihre Konsole eingeben:

sudo apt-get install jedit

Starten Sie jedit, klicken Sie auf den Menüpunkt Suchen, klicken Sie in der Menüliste auf den Menüpunkt Im Verzeichnis suchen. Der folgende Dialog wird angezeigt:

Jedit Search In Folder-Dialogfeld

Dies ähnelt dem von Notepad ++ und macht dasselbe, ich glaube, das ist, was Sie wollen.

Sabacon
quelle
Dies war perfekt, als ich nach einer ganzen Codezeile suchte und zögerte, jedem einzelnen Regex-Sonderzeichen zu entgehen, wenn ich das Gleiche getan hätte sed.
IQAndreas
Sie können Codeblöcke (wie HTML, Javascript usw.) in Sekunden ersetzen.
Lepe
Dies funktioniert nicht bei einer großen Anzahl von Dateien, nach ein paar Stunden hatte es keinen Ersatz gegeben, während Geany ein paar Minuten brauchte, um alle Vorkommen zu finden. Dies ist möglicherweise kein effizientes Suchen und Ersetzen, aber es erwärmt den Raum schön.
Mark Aroni
19

Eine andere GUI-Option ist regexxer : regexxer Screenshot

int_ua
quelle
Funktioniert einwandfrei (wenn Sie bereits mit Regex vertraut sind), danke.
Ernest
1
Auch wenn Sie Regex nicht kennen, können Sie dieses Tool als einfaches Werkzeug zum Suchen und Ersetzen von Zeichenfolgen verwenden. Es erledigt die Aufgabe für Sie, ohne Regex oder ähnliches.
Mohd Abdul Mujib
13
perl -pi -e 's/oldtext/newtext/g' *

Ersetzt alle Vorkommen von altem Text durch neuen Text in allen Dateien im aktuellen Ordner. Sie müssen jedoch alle Perl-Sonderzeichen im alten und neuen Text mit dem Backslash maskieren.

Michael K
quelle
9

Fragen Sie bei Geany nach , es ist der perfekte NPP-Ersatz für Linux. Sie können genau das tun und Sie können Regex verwenden.

Stefano Mtangoo
quelle
Ich liebe Geany! Es ist mein Lieblingseditor und leistungsstark genug.
Pisu
1
Soweit ich das beurteilen kann, ermöglicht Geany 1.23.1 (im Paket mit Ubuntu 13.10 enthalten) das Durchsuchen mehrerer Dateien mit Regex, jedoch nicht das Ersetzen in ihnen.
Drew Noakes
Sie können in Geany mehrere Dateien suchen und ersetzen, wenn Sie sie alle öffnen und dann die Schaltfläche "In Sitzung" im Dialogfeld "Suchen / Ersetzen" verwenden.
MV.
1
Wie öffnen Sie 5000 Dateien, die auf der Registerkarte Nachrichten aufgelistet sind?
Mark Aroni
1
Ok, der Regentreiber war so ziemlich das, wonach ich gefragt hatte, ich hatte ihn gerade übersprungen, weil sein Name Regex hat und ich neige dazu, alles zu vermeiden, was mit Regex zu tun hat. Aber ich habe mich geirrt, und dieses Tool hat genau das, was zum Suchen und Ersetzen benötigt wird.
Mohd Abdul Mujib
2

Sie können dieses Skript verwenden, Code kopieren und eine Datei erstellen find_and_replace_in_files.sh.

Ich habe es ein wenig modifiziert; Bitte sag mir deine Meinung.

# *****************************************************************************************
# 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
dimitrios
quelle
2

Ein anderes Programm ist Searchmonkey .

SearchMonkey ist eine leichte Gtk-Anwendung, mit der das umständliche Suchen / Suchen durch eine übersichtliche Benutzeroberfläche ersetzt werden soll, die schnell eine Markierung mit den Positionen und der Anzahl der Textübereinstimmungen enthält. Ziel ist es, Endbenutzern und Softwareentwicklern ein einfach zu bedienendes und zugängliches Suchwerkzeug zur Verfügung zu stellen.

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

arbeitet für mich auf Fedora

user328359
quelle
Sie können eine Zeile hinzufügen, in der erläutert wird, wie sich dies gegenüber askubuntu.com/a/84013/158442
muru
@muru Es werden viel weniger sedInstanzen ausgeführt! Es ist also viel schneller in Bezug auf die CPU-Zeit. Da die Dateizugriffszeit begrenzt wäre, denke ich, dass die Uhrzeit nicht viel schneller ist, aber eine geringere Systemlast ergibt. Note xargsfügt wie Hunderte von Dateinamen in die sedBefehlszeile eines einzelnen Befehls ein und füllt die verfügbare Puffergröße basierend auf der Länge der Pfade.
Volker Siegel
Hmm ... wenn dies geschlossen wird, könnte ich es durch eines ersetzen, das klar erklärt, warum es besser ist als das überstimmte.
Volker Siegel
@VolkerSiegel , die mit erreicht werden kann , +statt \;in find, nicht wahr?
Muru
1
@muru Möglicherweise ... Mein "richtiges Werkzeug für den Job" -Instinkt zieht eindeutig vor xargs, aber du hast recht; von man find: -exec command {} +: ... The command line is built in much the same way that xargs.... Erinnert mich an Befehlszeilen von git filter-branch...;)
Volker Siegel
2

Eine sehr einfache Lösung: Ersetzen Sie in allen *.txtDateien im Ordner string_1durch string_2:

sed -i 's/string_1/string_2/g' *.txt
Helmut P.
quelle
Gute Antwort! Nur eine Ergänzung. Wenn Sie eine Zeichenfolge in einer Datei des aktuellen Verzeichnisses rekursiv ersetzen möchten, versuchen Sie sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
Folgendes