Suchen und Ersetzen in mehreren Dateien

Lorzel

Aktives Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
538
Reaktionspunkte
69
Hallo!
Unter Linux kann ich im Terminal mit
find /<Pfad>/<Dateien> -type f -exec sed -i 's/<alter Begriff>/<neuer Begriff>/g' {} \;
erfolgreich Ersetzungen in mehreren Dateien, die sich in dem angegeben Pfad befinden vornehmen.
Natürlich klappt dies auf dem Mac nicht, so wie beschrieben. Wobei ich den Dateipfad mittels der Option "als Pfadname kopieren" einer der betreffenden Dateien entnommen und eingefügt habe. Wobei sich mein Test Ordner auf dem Schreibtisch befindet. Kann dann überhaupt der Pfad folgender Art sein?
"/Users/meinname/Desktop/KSQMKopieZuMExp/"?
Ich frage mich, ob dort am Anfang noch das Homeverzeichnis fehlt.
 
Du kennst den Unterschied zwischen gnu sed und bsd sed?

/Users/name ist das home.
 
Nein, den Unterschied kenne ich nicht. Bin noch Anfänger mit der Terminal-Benutzung.

Danke für den Hinweis mit dem Homeverzeichnis!
 
Das Problem ist, dass ich bei den ersten 20 Einträgen bei Google für "suchen und ersetzen in mehreren dateien Mac terminal" kein Ergebnis finde, wo beschrieben wird, wie/wo man im Mac Terminal den betreffenden Dateipfad zum Commando einträgt. Hingegen liefert für Linux gleich das erste Google-Suchergebnisse eine adäquate Möglichkeit, die ich auch schon probiert habe. Funktioniert sofort. Ich hatte gehofft, dass dies dann auch im Mac Terminal funktioniert, weil mir Google ja speziell für Mac keine Lösung verrät.
 
Such halt nicht nach mac sondern bsd sed.
Oder installier dir gnu sed über homebrew oder macports.
 
OK, ich kann es inzwischen konkretisieren:
Ich finde keine Kommandos für den Mac, in denen man (absolut) einen Pfad mit angeben kann, in dem sich die befreffenden Dateien befinden. Ich habe dann verstanden, dass sich das Skript immer auf diejenigen Dateien auswirken, die sich im gleichen Verzeichnis wie das Skript befinden.
DENNOCH: ich habe das Skript in meinem Testordner auf dem Schreibtisch abgelegt, dann das Kommando ohne absolute Pfadangabe gestartet und siehe da: der Mac fragt nach Erlauben Änderungen in Bild- und Video- etc Dateien vornehmen zu dürfen!!! Die Begrenzung hat also auf diese Art nicht funktioniert.
Es ist mir viel zu gefährlich, dieses Skript nicht zu begrenzen mit einer absoluten Verzeichnisangabe. Ich will aus Sicherheitsgründen solch ein Skript auch gar nicht auf meinem Rechner anlegen. In diesem Sinne finde ich Google rauf und runter kein Kommando. Egal, ob so gesucht wie oben oder nach bsd sed.
 
Zuletzt bearbeitet:
An sich musst du dem Terminal Festplattenvollzugriff geben, um es sinnvoll nutzen zu können.

Naja, die Begrenzung bei find findet im Kommando statt. Der Pfad der vorne steht ist das Startverzeichnis, von dort wird halt abwärts gesucht.
 
  • Gefällt mir
Reaktionen: ruerueka und dg2rbf
Sorry, ich habe wirklich noch zu wenig Ahnung. Habe mir deshalb gestern noch Grundlagen zum Terminal angelesen. Aber auch das hilft mir nicht weiter.
Gibt es wirklich keine konkrete Möglichkeit obigen Befehl für den Linux-Terminal so anzupassen, dass ich ihn auf im Mac Terminal einsetzen kann? (Ohne vorher das Verzeichnis wählen zu müssen und ohne den Terminal "auf bash umzustellen"?) Ich sitze jetzt schon wieder fast 1 ganzen Tag daran. Bei Linux hat es zwei 2 Min gedauert das hinzubekommen....
 
Nachtrag: Ich kann natürlich mit cd /../.. in das betroffene Verzeichnis wechseln. Aber auch dann funktionieren Befehle wie

"sed -i .backup 's//RoentgenPeaks/PPPPPPPPPP/g' file.txt"
liefert "sed: 1: "s//RoentgenPeaks/PPPPPP ...": bad flag in substitute command: 'P'"

oder

"sed -i '' 's/old/new/' file"
liefert ""sed: file: No such file or directory"

nicht :-(
 
Das geht alles... du hast verschiedene Baustellen, die du angehen musst:
- zsh lernen (oder den Terminal auf bash umstellen), hier gibt es eine nette Übersicht: https://apple.stackexchange.com/que...he-practical-differences-between-bash-and-zsh
- die Möglichkeiten des bsd "find" Programmes lernen, um "die richtigen" Dateien zu finden und den richtigen Startpunkt anzugeben. Warum sollte dein "-type f" keine Videodateien finden? Verwende zB -name "*.txt", um nur Textdateien zu finden... Oder eben komplexere Suchmuster (regex). Kannst du ja ganz ungefählich ohne sed testen...
- ich sehe gerade: am Thema "Name der Backup-Datei" -i bei bsd "sed" sitzt du ja schon. Hier noch eine Quelle zur Unterstützung: https://unix.stackexchange.com/ques...hieve-portability-with-sed-i-in-place-editing
 
Gibt es wirklich keine konkrete Möglichkeit obigen Befehl für den Linux-Terminal so anzupassen, dass ich ihn auf im Mac Terminal einsetzen kann?
Du kannst dir ein GNU sed installieren.
So schwierig ist das auch nicht.
Wird dann meist gsed genannt zur Unterscheidung.
 
Können wir nicht vielleicht so rum machen:
Ihr verratet mir die Lösung und ich vollziehe es nach?
Falls noch nicht deutlich geworden:
Ich möchte in allen Inhalten der Dateien (es sind tex-Dateien) den "RoentgenPeaks" durch "PPPPPPP" ersetzen. Oder ist das ein Fall für Albert Einstein?

Ich bin mehrere Stunden am rumprobieren in drei Foren. Mit Linux ging es SOFORT. Ich habe gesucht und genau das gefunden, was ich brauche. Und auch genauso wie beschrieben verhält sich der Befehl. Bei Mac ist es egal, was ich finde. Nichts davon führt zum Erfolg. Und in den Foren bekomme ich nur die Empfehlungen noch mal weiter zu suchen. Das kann doch nicht sein???
 
Das könnte daran liegen, dass niemand Bock hat die sed Syntax zu lernen, wir uns das alle erst selbst raus suchen müssen und es nicht aus dem Gedächtnis können.
Und da du das auch selbst tun kannst.
Denk an die die Berg Predikt mit dem Fisch.

Kleiner Tipp:
Lad dir BBEdit und nutz dessen Suchen und Ersetzen über mehrere Dateien.
Dürfte schneller gehen.
 
  • Gefällt mir
Reaktionen: win2mac und dg2rbf
Hier noch ein Beispiel für meine Versuche mit dem Terminal
TerminalFuerSuchenUndErsetzen.png
 
Das könnte daran liegen, dass niemand Bock hat die sed Syntax zu lernen, wir uns das alle erst selbst raus suchen müssen und es nicht aus dem Gedächtnis können.
Und da du das auch selbst tun kannst.
Denk an die die Berg Predikt mit dem Fisch.

Kleiner Tipp:
Lad dir BBEdit und nutz dessen Suchen und Ersetzen über mehrere Dateien.
Dürfte schneller gehen.
Aber das, was ich vor habe, ist absolut basic?! Solche Ersetzungen sind total alltäglich. Das kann nicht derart unbekannt und exotisch sein, dass keiner für den Mac die Lösung kennt. Wir reden hier von einem Einzeiler!
 
Das geht alles... du hast verschiedene Baustellen, die du angehen musst:
- zsh lernen (oder den Terminal auf bash umstellen), hier gibt es eine nette Übersicht: https://apple.stackexchange.com/que...he-practical-differences-between-bash-and-zsh
- die Möglichkeiten des bsd "find" Programmes lernen, um "die richtigen" Dateien zu finden und den richtigen Startpunkt anzugeben. Warum sollte dein "-type f" keine Videodateien finden? Verwende zB -name "*.txt", um nur Textdateien zu finden... Oder eben komplexere Suchmuster (regex). Kannst du ja ganz ungefählich ohne sed testen...
- ich sehe gerade: am Thema "Name der Backup-Datei" -i bei bsd "sed" sitzt du ja schon. Hier noch eine Quelle zur Unterstützung: https://unix.stackexchange.com/ques...hieve-portability-with-sed-i-in-place-editing
Danke für Deine Mühe, hilft mir aber auch nicht weiter. Ich habe quasi keine Erfahrung mit dem Linux Terminal. Ich kann keine Ersetzungen in meinem Kopf vornehmen. Das ist nix, worauf ich aufbauen kann. Ich kann hier nur den Eingangs erwähnten Befehl beitragen.
 
Siehe @oneOeights Link:

Code:
% find /Users/<name>/<path>/<to>/<folder> -type f -exec sed -i '' -e 's/<foo>/<bar>/g' {} \;

% find /Users/<name>/<path>/<to>/<folder> -type f -exec sed -i '.old' -e 's/<foo>/<bar>/g' {} \;
% find /Users/<name>/<path>/<to>/<folder> -type f -exec sed -i.old -e 's/<foo>/<bar>/g' {} \;
 
Sorry, aber steht sau viel drin. Und es nicht genau die Lösung dabei, die ich suche. Ich habe wirklich quasi KEINE Ahnung von den Befehlen. Ich brauche eine 1 zu 1 Kopie, wo ich nur noch meinen Dateipfad und meine Ersetzungen reinpacken muss. Der von Dir angegebenen Link führt zu einer allgemeinen Diskussion darüber wie wo was zu ersetzen ist zwischen bsd und linux. Wie in den Kommandos ersetzt wird, ist für mich nicht so leicht einsehbar. Also sprich, ob
nur Dateinamen oder Dateiinhalte ersetzt werden,
welchen Dateitypen und
welche Verzeichnisse einbezogen werden.
Das ist doch für mich als Laie viel zu gefährlich?! Und auch nicht praktikabel. Es ist ja schön, dass wir das umfassender, bildungsreicher anlegen. Aber das überfordert mich mal eben so einen Lehrgang zu machen, wo ich gerade nur erst mal eine konkrete Anwendung brauche.
 
Siehe @oneOeights Link:

Code:
% find /Users/<name>/<path>/<to>/<folder> -type f -exec sed -i '' -e 's/<foo>/<bar>/g' {} \;

% find /Users/<name>/<path>/<to>/<folder> -type f -exec sed -i '.old' -e 's/<foo>/<bar>/g' {} \;
% find /Users/<name>/<path>/<to>/<folder> -type f -exec sed -i.old -e 's/<foo>/<bar>/g' {} \;
Daher für diese Konkretisierung.
Allerdings liefern alle drei Eingaben je die Fehlermeldung
Code:
sed: RE error: illegal byte sequence
 
Zuletzt bearbeitet:
Zurück
Oben Unten