Suchen und Ersetzen in mehreren Dateien

ruerueka

Aktives Mitglied
Dabei seit
04.04.2004
Beiträge
1.896
Punkte Reaktionen
516
Du hast alle Platzhalter, die tigion liebevoll in spitze Klammern gesetzt hat, ausgetauscht?
 

Lorzel

Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
394
Punkte Reaktionen
55
Du hast alle Platzhalter, die tigion liebevoll in spitze Klammern gesetzt hat, ausgetauscht?
Ich denke schon. Unter Linux kriege ich es ja auch hin. Oder meinst, ich soll die spitzen Klammern erhalten, a la
Code:
find /Users/<meinname>/<Desktop>/<KSQMKopieZuMExp> -type f -exec sed -i '' 's/<RoentgenPeaks>/<PPPPPPPPPP>/g' {} \;
 

Lorzel

Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
394
Punkte Reaktionen
55
Ich denke, der Tipp von @oneOeight bzgl. BBEdit ist wirklich zielführend...
Ich würde das wirklich gern mit dem Terminal hinbekommen. Denn ständig werde ich bei Problemen auf Terminaloperation verwiesen, sodass ich eingesehen habe, dass ich so oder so mit diesem Tool umgehen lernen muss. Und nur ein Tool für alles zu haben erscheint mir übersichtlich. Dennoch habe ich BBEdit geladen. Ist ja genauso umfangreich wie der Terminal. Aber auch dort: ich bin blutiger Anfänger. Das wird nicht schneller gehen als im Terminal. Ich bin dort genauso überfordert. Ich brauche für den Anfang ein funktionierendes Muster.
 

RIN67630

Aktives Mitglied
Dabei seit
13.09.2021
Beiträge
2.788
Punkte Reaktionen
1.184
Ich weiss nicht, ob es als Antwort für dich taugt, aber jeden Programmiereditor (z.B. Brackets) macht Suchen und Ersetzen in Verzeichnisse von Haus aus, Ohne eine Syntax lernen zu müssen.
 

lisanet

Aktives Mitglied
Dabei seit
05.12.2006
Beiträge
6.257
Punkte Reaktionen
6.772
Daher für diese Konkretisierung.
Allerdings liefern alle drei Eingaben je die Fehlermeldung
Code:
sed: RE error: illegal byte sequence

- das {} mus womöglich escaped werden oder noch einfacher: gequoted, also

Code:
"{}"

- spitze Klammern dürfen nicht enthalten sein
- wie lautet dein Suchstring und wie dein Ersatzstring. Eventuell musst du dann auch darin einzelne Zeichen escapen
- in #23 fehlt ein -e vor dem RE (dem Ding mit s/....)
 

ruerueka

Aktives Mitglied
Dabei seit
04.04.2004
Beiträge
1.896
Punkte Reaktionen
516
Ich denke schon. Unter Linux kriege ich es ja auch hin. Oder meinst, ich soll die spitzen Klammern erhalten, a la
Code:
find /Users/<meinname>/<Desktop>/<KSQMKopieZuMExp> -type f -exec sed -i '' 's/<RoentgenPeaks>/<PPPPPPPPPP>/g' {} \;
nein, auf keinen Fall... das passt so schon:
Code:
find /Users/meinname/Desktop/KSQMKopieZuMExp -type f -exec sed -i '' -e 's/RoentgenPeaks/PPPPPPPPPP/g' {} \;
Ich hab das -e von @lisanet noch eingebaut. Leider hab ich keinen Mac / kein BSD vor der Nase, sonst könnte ich jetzt testen...
 
Zuletzt bearbeitet:

Lorzel

Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
394
Punkte Reaktionen
55
Ich sehe jetzt das Ersetzungen "manchmal" stattfinden.
Wenn ich
Code:
find /Users/meinname/Desktop/KSQMKopieZuMExp -type f -exec sed -i.old -e 's/Strahlungsverteilung/SSSSSSSSSS/g' {} \;
verwende, werden Reintextdateien .old angelegt. Auch wenn in der neuen Datei keine Ersetzungen vorgenommen wurden (Sinn ist wahrscheinlich, dass man trotzdem von dieser Datei weiß, dass sie durchgeschaut wurde nach dem zu ersetzenden Begriff). Die Fehlermeldungen

Code:
sed: RE error: illegal byte sequence

kommen trotzdem. Auch mit "{}".
Mit den Fehlermeldungen könnte ich leben, wenn nun die Ersetzungen noch auf die tex-Dateien angewendet werden würden.

@lisanet was meinst Du mit Suchstring? Also suchen tue ich (jetzt) nach Strahlungsverteilung. Ersetzt werden soll es mit SSSSSSSSS.
Oh ja, das -e. Ich hatte zwischendurch einen anderen Befehl, den mir jemand geraten hat aus dem Ubuntu-Forum probiert:

Code:
find /<Pfad>/<Dateien> -type f -exec sed -i '' 's/<alter Begriff>/<neuer Begriff>/g' {} \;
 

lisanet

Aktives Mitglied
Dabei seit
05.12.2006
Beiträge
6.257
Punkte Reaktionen
6.772
@lisanet was meinst Du mit Suchstring?

ok, ich lasse es sein, sorry. Aber wenn ich dir erst erklären muss, was ich mit Suchstring meine, dann werden wir hier nie fertig. Du findest sicher jemand anderen, der die diesen Begriff erklärt und weiter hilft.

Dem kannst du dann auch gleich sagen, dass ich mal auch sowas hatte mit "illegal byte sequence" bei sed. Ich weiß nur nicht mehr 100%-ig woran es lag, war es die Textkodierung des Terminals oder die der Textdateien, oder sog. formatierter Text, oder war es banal mal wieder nur der Unterschied zwischen der Windows-Art das Zeilenende zu markieren und der *nix-üblichen, sprich LF und CR anstatt nur LF
 

ruerueka

Aktives Mitglied
Dabei seit
04.04.2004
Beiträge
1.896
Punkte Reaktionen
516

oneOeight

Aktives Mitglied
Dabei seit
23.11.2004
Beiträge
64.572
Punkte Reaktionen
13.563
Welches Text Encoding haben die Dateien?
Scheint ja UTF dabei zu sein.
Da hast dann viel Spaß mit dem Suchen/Ersetzen.

Nimm BBEdit.
So schwierig ist es nicht, da den passenden Menüpunkt zu finden.
 

Lorzel

Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
394
Punkte Reaktionen
55
Auf Mac-Rumors wurde mir gesagt, ich soll
Code:
sed -i '' 's/Strahlungsverteilung/SSSSSSSSSS/' /Users/meinname/Desktop/KSQMKopieZuMExp/*.txt
benutzen.
Ich habe nun probiert, diesen Befehl auf tex-Dateien loszulassen. Danach habe ich die Endung durch den Befehl auf tex geändert.
Code:
sed -i '' 's/Strahlungsverteilung/SSSSSSSSSS/' /Users/meinname/Desktop/KSQMKopieZuMExp/*.tex
Gab keine Änderung im Inhalt der Tex-Datei.
Danach habe ich Reintextdateien in das Verzeichnis gelegt. Diese sowohl ohne Endung, als auch mit txt, als auch mit rtf (weil der Mac dies vorschlug) dort abgelegt und obigen Befehl mit rtf probiert. Die mit dem TextEditor angelegte Reintextdatei enthält den Text
"Strahlungsverteilung eines bestimmten Anodenmaterials (siehe AB aus dem Unterricht). Erläutere"
wurde ersetzt durch
"{\rtf1\ansi\ansicpg1252\cocoartf2636
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\paperw11900\paperh16840\margl1440\margr1440\vieww11520\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0

\f0\fs24 \cf0 SSSSSSSSSS eines bestimmten Anodenmaterials (siehe AB aus dem Unterricht). Erl\'e4utere}"

Ich schließe daraus, dass es ein utf8-Problem gegeben haben könnte. Ich hatte diese Text-Passage aus einem mit latin formatiertem tex-File entnommen.
Wenn ich das tex-File zuvor auf utf8 stelle und dann erst den Quelltext aus dem tex-File entnehme, bekomme ich das, was ich will - ohne Fehlermeldung:

"SSSSSSSSSS eines bestimmten Anodenmaterials (siehe AB aus dem Unterricht). Erläutere"
Allerdings wird diese Änderung erst sichtbar, wenn man den zum Betrachten geöffneten Text-Editor schließt und dann wieder öffnet (Alternativ: ein bisschen wartet?)

Damit ich nicht alle Tex-Dateiendungen umbenennen muss, wäre jetzt noch eine Möglichkeit, das Kommando auch auf tex-Dateien anwenden zu können famos.
 
Zuletzt bearbeitet:

Lorzel

Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
394
Punkte Reaktionen
55
Welches Text Encoding haben die Dateien?
Scheint ja UTF dabei zu sein.
Da hast dann viel Spaß mit dem Suchen/Ersetzen.

Nimm BBEdit.
So schwierig ist es nicht, da den passenden Menüpunkt zu finden.
UTF8 war also der richtige Riecher.
 

tigion

Aktives Mitglied
Dabei seit
21.06.2006
Beiträge
1.483
Punkte Reaktionen
325
Ich habe es eben mal nachgestellt und getestet. Der Befehl in meinem Beitrag funktioniert bei mir. Was auch für den Fehler sorgen kann, sind die vom Finder automatisch generierten .DS_Store Dateien. Diese werden von sed als binary Type erkannt und werfen oben genannten Fehler.

Über -name bzw. Kombinationen davon, kann man Dateinamen eingrenzen.

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

Lorzel

Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
394
Punkte Reaktionen
55
Abschließend:
Code:
sed -i '' 's/old/new/' ~/Desktop/aaa/*.tex
tut's, wenn ich nur utf8-codierte (Quell-)Texte im Verzeichnis habe.
Bei mir ist leider die Spezifikation mit latin-codierten (Quell-)Texten aufgetreten (zusätzlich und gepaart mit nicht passenden Kommandos).

Insofern betrachte ich von meiner Seite das Problem als erledigt und bedanke mich für Eure Hilfe.
 
Zuletzt bearbeitet:

Lorzel

Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
394
Punkte Reaktionen
55
Ich habe es eben mal nachgestellt und getestet. Der Befehl in meinem Beitrag funktioniert bei mir. Was auch für den Fehler sorgen kann, sind die vom Finder automatisch generierten .DS_Store Dateien. Diese werden von sed als binary Type erkannt und werfen oben genannten Fehler.

Über -name bzw. Kombinationen davon, kann man Dateinamen eingrenzen.

Code:
find /Users/<name>/<path>/<to>/<folder> -type f -name '*.txt' -exec sed -i '' -e 's/<foo>/<bar>/g' {} \;
Funktioniert jetzt auch bei mir! Keine Fehlermeldungen mehr. Verzeichnis jedoch inzwischen verschlankt auf nur noch eine (utf8-codierte)-tex-Datei. Also auch hier nochmals danke!
 
Oben