Dateiinhalt suchen und ersetzen Linux Shell

Folgendes Problem:
Ich muss über 7000 Dateien durchsuchen nach bestimmtem Inhalt (Text1), wobei die Dateinamen variieren. Bei allen gefundenen Dateien, welche Übereinstimmung aufweisen soll automatisch der gefundene Dateiinhalt (Text1) gegen den neuen Inhalt (Text2) ausgetauscht werden, wobei Speicherort und Name der Datei nicht verändert werden dürfen.
Das ganze sollte in der Linux Shell funktionieren.

Fallbeispiel:
Gesucht wird „bisher der alte“ in Inhalt „der Suchtext ist bisher der alte!“
Ersetzt werden soll „bisher der alte“ gegen „jetzt der neue“ wobei das Ergebnis dann „der suchtext ist jetzt der neue!“ lauten soll.

Für Ideen bin ich offen.

Ich gebe zu bedenken das dies mein erster versuch unter Linux ist. … mehr auf http://w-w-w.ms/a47y3u

find /path/ -type f -iname „muster“ -exec sed -i s/OLDTEXT/NEWTEXT/g {} ;
oder
find /path/ -type f -exec sed -i s/OLDTEXT/NEWTEXT/g {} ;

Google --> Schlüsselwörter find grep suchen ersetzen oder find grep искать заменить oder find grep search replace

http://stackoverflow.com/questions/6178498/using-gre…
http://wiki.enchtex.info/tools/console/find
http://www.shatlovsky.ru/2009/02/09/poisk-i-zamena-v…
http://www.levik.info/linux-find-and-replace-sed.htm

Folgendes Problem:
Ich muss über 7000 Dateien durchsuchen nach bestimmtem Inhalt
(Text1), wobei die Dateinamen variieren. Bei allen gefundenen
Dateien, welche Übereinstimmung aufweisen soll automatisch der
gefundene Dateiinhalt (Text1) gegen den neuen Inhalt (Text2)
ausgetauscht werden, wobei Speicherort und Name der Datei
nicht verändert werden dürfen.

Man arbeitet NIE auf den Originaldateien…

Mein Vorgehen wäre:

Kopiere Dir die Verzeichnisstruktur in ein temporäres Verzeichnis…

Iteriere über gesamten, alten Verzeichnisbaum:

Exitstatus von grep gibt dir zurück, ob Text1 gefunden wurde…

Für Dateien, für die Text1 gefunden wurde:
grep lifert dir die Byte-Offsets, head und tail schneiden Dir Anfang und Ende der Datei, und
cat Anfang Text2 Ende > tmpVerzeichnis/…/AlterDateiname liefert Dir prinzipiell die zusammengebaute Datei

Du läßt Dir die Diffs zwischen alten Verzeichnis und neuem ausgeben, und kontrollierst die Ersetzungen.

Du legst ein tar Deines alten Verzeichnisses an.
Du kopierst die Dateien Deines temporären Verzeichnisbaums auf die alte Positionen.

Das ganze sollte in der Linux Shell funktionieren.

Fallbeispiel:
Gesucht wird „bisher der alte“ in Inhalt „der Suchtext ist
bisher der alte!“
Ersetzt werden soll „bisher der alte“ gegen „jetzt der neue“
wobei das Ergebnis dann „der suchtext ist jetzt der neue!“
lauten soll.

Für Ideen bin ich offen.

Ich gebe zu bedenken das dies mein erster versuch unter Linux
ist. … mehr auf http://w-w-w.ms/a47y3u

HA

Geht mit Linux ganz einfach

sed -i ‚s/bisher der alte/jetzt der neue/g‘ Pfad/zu/Dateien/*.txt

Wenn du ganz spezielle Dateien suchst und verändern möchtest, kannst du auch erst mit find danach suchen

find / -type f -name „some*“ -exec sed -i ‚s/bisher der alte/jetzt der neue/g‘ {} ;

Folgendes Problem:
Ich muss über 7000 Dateien durchsuchen nach bestimmtem Inhalt
(Text1), wobei die Dateinamen variieren. Bei allen gefundenen
Dateien, welche Übereinstimmung aufweisen soll automatisch der
gefundene Dateiinhalt (Text1) gegen den neuen Inhalt (Text2)
ausgetauscht werden, wobei Speicherort und Name der Datei
nicht verändert werden dürfen.

Solche Sachen mache ich mittlerweile in Java. Mit der shell mache ich momentan nur noch das nötigste. TCL/TK ist auch eine Möglichkeit. Geht noch schneller! Gruß VA

… Ich muss über 7000 Dateien durchsuchen nach bestimmtem
Inhalt … Bei allen gefundenen Dateien, welche
Übereinstimmung aufweisen soll automatisch der
gefundene Dateiinhalt (Text1) gegen den neuen Inhalt (Text2)
ausgetauscht werden…

Moin, moin,

da gibt es verschiedene Lösungsansätze. Befehlskombinationen, Shell-Skripts oder bessere Editoren.

Schau doch mal hier:
http://www.tecchannel.de/storage/tipps/2033812/suche…
http://www.unixboard.de/vb3/showthread.php?14729-Str…
http://www.yourhelpcenter.de/2012/06/linux-rekursive…

auch hier gab es schon Lösungen:
/t/suchen-ersetzen-in-mehreren-dateien/1077783

Tschüß, Matthias

Hallo M0J01812,

Folgendes Problem:
Ich muss über 7000 Dateien durchsuchen nach bestimmtem Inhalt
(Text1), wobei die Dateinamen variieren. Bei allen gefundenen
Dateien, welche Übereinstimmung aufweisen soll automatisch der
gefundene Dateiinhalt (Text1) gegen den neuen Inhalt (Text2)
ausgetauscht werden, wobei Speicherort und Name der Datei
nicht verändert werden dürfen.
Das ganze sollte in der Linux Shell funktionieren.

Dann würde ich eine Kombination aus den Befehlen find und sed nutzen.
Hier mal ein Muster für das Ersetzen mit sed für eine einzelne Datei:

sed -i ‘s/original\_word/new\_word/g’ file.txt

Damit sucht sed in der Datei file.txt nach ALLEN Vorkommnissen (/g für global) des Wortes „original_word“ und ersetzt es durch „new_word“.

Hier noch ein Beispiel für das Suchen von Dateien ohne einen Namen oder einen Teilnamen zu nutzen:

find . -type f

Das ist eine ganz simple Suchroutine, um innerhalb des Ordners, in dem man sich befindet (dafür steht der .), alle Dateien auffinden und deren Namen anzeigen zu lassen.

Wie sind denn die Dateien im System abgelegt?
Alle in einem Ordner oder in Unterordnern?

Hier bräuchte ich noch etwas Input, um auch den passenden Suchbefehl zu generieren.

Eine Möglichkeit, wenn alle Dateien innerhalb eines Ordners und ggf. in Unterordnern liegen würde so aussehen:

find . -type f -exec sed -i 's/bisher\ der\ alte/jetzt\ der\ neue/g' {} \;

Wichtig hier, die Leerzeichen innerhalb des sed Anweisung mit Backslashes zu escapen und das Leerzeichen nach den geschweiften Klammern.

Probier das doch mal in einem Ordner mit Testdateien aus.
Mit diesem Befehle erstellst Du Dir mal „schnell“ 1000 Testdateien in 10 Unterordnern:

for dir in `seq -w 1 10`;
 do
 # Ordnerstruktur erstellen
 mkdir -p ~/sedTest/testdir$dir;

 # Dateien mit Inhalt erstellen
 for file in `seq -w 1 100`;
 do
 echo -e "Datei $file\n\nDatei Inhalt Original" \> ~/sedTest/testdir$dir/testfile$file;
 done;
 done;

Jetzt wechselst Du mit cd ~/sedTest in den neuen Ordner und lässt mal folgenden Befehl laufen:

find . -type f -exec sed -i 's/Datei\ Inhalt\ Original/Neuer\ Datei\ Inhalt/g' {} \;

Wenn Du möchtest, kann ich Dir hierfür gerne ein Shell Skript schreiben, ich bräuchte nur ein paar Info’s mehr. Darin musst Du nur noch die Textstellen eingeben, welche ersetzt bzw. wodurch sie ersetzt werden sollen ändern musst.

Ich hoffe Dir damit schon weitergeholfen zu haben.

Viele Grüße
Peter

Moin!
Also - Du könntest einfach sed bemühen: Der „StreamEditor“ kann mittels Kommandozeile reguläre Ausdrücke bearbeiten - und dann kannst Du einfach ein „Replace“ machen.
Okay? Viel Erfolg und Gruß
Bastian

Hallo

zum Suchen der Dateien, die Deinen Text enthalten, kannst, Du find nehmen.

find /Pfad -exec grep „Text“ {} .

Und das Ganze in eine Schleife mit for und sed wie oben.

Habe gerade keine Zeit ein komplettes Script zu basteln.

Michael

Hallo,

sorry für die Verspätung, ich war im Urlaub :smile:.

Hier sehe ich persönlich drei Wege: awk, sed oder ein eigenes kleines Programm.
Grundsätzlich ist es kein Problem, mehrere Dateiinhalte zu ändern. Wahrscheinlich wird awk der schnellste, aber wohl auch der komplizierteste Weg sein (wegen der Syntax), ich würde wohl ein kleines PHP-Skript bauen, aber das sind alles persönliche Präferenzen. Ein fertiges Skript kann ich jedoch hier nicht liefern, das würde den Umfang des Supports sprengen (ich mache aber auch keinen kostenpflichtigen Support).

Sollte sich noch keine Lösung gefunden haben, sprich mich bitte nochmal an, dann kann ich ggfs. etwas kleines bauen.

Gruß
Rolf

Hallo,
bitte entschuldige, dass ich erst heute antworte, aber ich war letzte Woche im Urlaub.
Ich könnte mir folgende Lösungen vorstellen. Dabei steht DATEI für das Muster, mit dem du die passende Datei suchst, und old für das alte auszutauschende Muster IN der Datei und new für den neuen Inhalt.
---------- 1 ----------------
find . -name *DATEI* -exec sed -i s/old/new/g {} ;

oder
----------- 2 ----------------
perl -i.bak -lane ‚s/old/new/g‘ find . -name *DATEI*

Bitte beachte bei Lösung 2, dass vor find ein Accent grave steht und am Ende der Zeile auch - KEIN Apostroph.

Viel Erfolg,
Ute