Automatisches Ersetzen von Textinhalten, die "/" enthalten

L

Lorzel

Aktives Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
538
Reaktionspunkte
69
Hallo!

in meinem Beitrag https://www.macuser.de/threads/suchen-und-ersetzen-in-mehreren-dateien.893585/
hatte ich mit Mitgliedern zusammen herausgefunden, dass man mittels

Code:
sed -i '' 's/old/new/' ~/Desktop/aaa/*.tex

mittels Terminal Textinhalte mehrerer Dateien ersetzen kann.

Nun habe ich das Problem, dass in "old" und "new" leider "/" vorkommen. Gibt es eine Möglichkeit, auch solche Textinhalte, die Terminal-Befehls-Trennzeichen enthalten, zu ersetzen?
Beispiel zum besseren Verständnis:
Zu ersetzendes: BlaBla/BlubbBlubb
Ersetzendes: BliBli/BlebbBlebb
 
Sowas würde ich mit BBEdit machen.
Multiple-File-Search bsw.
 
  • Gefällt mir
Reaktionen: Elektroschrott und Stargate
Hallo!

in meinem Beitrag https://www.macuser.de/threads/suchen-und-ersetzen-in-mehreren-dateien.893585/
hatte ich mit Mitgliedern zusammen herausgefunden, dass man mittels

Code:
sed -i '' 's/old/new/' ~/Desktop/aaa/*.tex

mittels Terminal Textinhalte mehrerer Dateien ersetzen kann.

Nun habe ich das Problem, dass in "old" und "new" leider "/" vorkommen. Gibt es eine Möglichkeit, auch solche Textinhalte, die Terminal-Befehls-Trennzeichen enthalten, zu ersetzen?
Beispiel zum besseren Verständnis:
Zu ersetzendes: BlaBla/BlubbBlubb
Ersetzendes: BliBli/BlebbBlebb

zwei Möglichkeiten:

a) ändere das Trennzeichen von / in z.Bsp |

b) escape im Such- und Ersatztext das / mit \. Willst du ein \ escapen, dann wird das zu \\

Also

a)
Code:
a) sed -i "" 's|Such/text|Ersatztext/mit/slash|' ...

b)
Code:
b) sed -i "" 's/Such\/text/Ersatztext\/mit\/slash/' ...

Tipp:

Es empfiehlt sich den Schalter g anzuhängen, damit alle Vorkommen in der Datei ersetzt werden und nicht nur der erste, also z.Bsp

Code:
a) sed -i "" 's|Such/text|Ersatztext/mit/slash|g' ...
 
  • Gefällt mir
Reaktionen: win2mac und Lorzel
@lisanet Habe Deine Methode b) gewählt, works fine! ❤️ Dank!
 
  • Gefällt mir
Reaktionen: dg2rbf
Hallo! Hier noch eine weiter Schwierigkeit:
Ich möchte Phrasen auskommentierter Pakete, etwa "%\usepackage{portland}" ersetzen durch "\usegraphicspath{...}".
Problem: wenn ich
"sed -i '' 's/%\graphicspath/\graphicspath/' /Users/Name/Documents/UeAWinkel/*.tex" benutze, werden keine Ersetzungen vorgenommen, wahrscheinlich weil "%" auch im Terminal ein Auskommentieren bewirkt?.
Wenn ich "sed -i '' 's/\%\graphicspath/\graphicspath/' /Users/Name/Documents/UeAWinkel/*.tex" benutze, also mit escapen von "%", so wird ebenfalls nix ersetzt.
Hingegen funktioniert ein ersetzen von Passagen mit "% Blabla" ersetze durch "Blubblub", so geht dies. Dh ersetzen von Passagen mit "%" und "\" scheint nicht ohne weiteres zu funktionieren. Weiß jemand Rat?
 
...du musst die backslashes escapen, nicht das %. Steht auch schon oben.

Ebenso { und }. Wenn du in den Texten noch ein / hast, musst du auch das escapen, da du / als Trenner nimmst. Du könnstest auch einen anderen Trenner nehmen, wie | so dass du / nicht escapen müsstest. Das kann bei Pfadangaben in den Texten die Lesbarekit drastisch erhöhen.

Zudem solltest du ein g ans Ende des s-Befehls setzen, also "s/suchtext/ersatztext/g" damit alle eventuellen Vorkommen in einer Zeile erfasst werden, es sei denn du kannst das ausschließen. Auch das steht schon oben.
 
  • Gefällt mir
Reaktionen: Lorzel
@lisanet Oh ja, entschulde, dass mit dem "\\" hattest Du ja oben geschrieben. Aber danke für die Zusatzinfo, dass auch {} escaped werden und mit dem |, das ist tatsächlich praktisch!

Edit: Also bei mir klappt es jedoch auch ohne escapen von "{" und "}".
 
Zuletzt bearbeitet:
nach etwas Pause noch mal zu dem Thema:

Ich will obiges erneut auf einen anderen Ordner loslassen:

Code:
sed -i '' 's/\%\\usepackage{portland}/\\graphicspath{{\/Users\/Name\/Testordner\/Bild}}/' /Users/Name/Testordner/*.tex

liefert jedoch
sed: RE error: illegal byte sequence

Wenn ich nun die "{" und "}" noch auskommentiere

Code:
sed -i '' 's/\%\\usepackage\{portland\}/\\graphicspath{{\/Users\/Name\/Testordner\/Bild\}\}/' /Users/Name/Testordner/*.tex

liefert
sed: 1: "s/\%\\usepackage\{portl ...": RE error: invalid repetition count(s)

Beim Beispiel vorher hatte noch alles gefunzt😐

Weiß jemand Rat?
 
Zuletzt bearbeitet:
Ah - hab's rausgefunden: die tex-Dateien waren teilweise NICHT UTF8-formatiert. Jetzt klappt obiges wieder:)

Edit: ..jetzt brauche ich nur noch ein Tool, dass mir alle diejenigen Tex-Dateien, die mit ISO formatiert sind nach UTF8 formatiert. Das sind einige Tausend. Schlecht ist vielleicht auch "doppelt" zu konvertieren? Also eine UTF8-Datei als ISO formatiert zu interpretieren und dann zu formatieren😵‍💫
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: dg2rbf
  • Gefällt mir
Reaktionen: dg2rbf und Lorzel
Zuletzt bearbeitet:
Zuletzt bearbeitet:
Kann man diesen Befehl so verändern, dass auch rekursiv ersetzt wird? Also Unterverzeichnisse mit einbezogen werden?
Sed selber nicht.
Du hast die Tage doch etwas über Schleifen oder dem find Befehl gelernt.
Und pass auf, wenn du eine Anleitung zu sed suchst. Die meisten Linux Sachen, die du findest, behandeln GNU sed und nicht das BSD sed von MacOS.

Und teste deine Ersetzungen erst einmal ohne die original Dateien zu überschreiben.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: dg2rbf
Habe mehrere Stunden dran gesessen, deswegen frage ich. Könnte hier die sämtlichen falschen Lösungen aufschreiben. Aber machen wir es kurz:
Ich habe auf MacRumors eine Lösung bekommen:
Code:
sed -i '' 's/old/new/' ~/Desktop/aaa/*/*.tex
Dies geht bis zum Unterordner "1. Grades". Wenn man nicht "/*/*/*/*/*..." schreiben möchte, so kann man auch hiermit
Code:
find ~/Desktop/aaa/ -maxdepth 5 -name '*.tex' -exec sed -i '' 's/old/new/' {} +
die Unterordnertiefe mittels Zahlenwert einstellen.
Noch lieber wäre mir eine Lösung/Option, die von vornherein bis zum tiefsten Unterordner geht. Aber ich kann natürlich maxdepth 100 wählen und gut ist.
 
Willst das begrenzen oder nur im untersten Ordner suchen?
Ohne maxdepth durchsucht dir find alle Unterordner.
 
Willst das begrenzen oder nur im untersten Ordner suchen?
Ohne maxdepth durchsucht dir find alle Unterordner.
Gute Frage. Ich brauche im Moment weder eine Begrenzung der Tiefe, noch will ich nur in/ab einer bestimmt Tiefe ersetzen lassen. Wäre aber wohl generell ne nützliche Option, wenn man tatsächlich nicht BIS zu einer Tiefe suchen will, sondern IN/AB einer bestimmten Tiefe.
Obiges funktioniert auf jeden Fall bis zur (in diesem Fall) Tiefe 5, so wollte ich es auch haben.
Aber falls hier jemand noch "IN/AB" statt "BIS" posten mag, ich bin interessiert.
 
Ja, wenn du einen Blick in die man page werfen würdest, könnte dir mindepth auffallen.
 
OK, jetzt hab es gerafft, nach dem 1 h Stunde Dateiinhalte damit in verschiedenen Verzeichnissen umbenannt (den kompletten Rechner samt aller angeschlossenen Festplatten war mir zu riskant). Also beide Befehle suchen nur IN - nicht Bis und auch nicht AB - der angegebenen Verzeichnisebenentiefe.
Also macht maxdepth weglassen Sinn, wenn sowie alle Unterordner, die innerhalb Startverzeichnis liegen, dazu genommen werden sollen. Das hatte ich dann tatsächlich falsch verstanden, das hätte Arbeit und Verwunderung gespart.
 
  • Gefällt mir
Reaktionen: dg2rbf
Ja, wenn du einen Blick in die man page werfen würdest, könnte dir mindepth auffallen.
Ja wahrscheinlich ist das nützlich für mich. Danke für diesen Hinweis.
Aber wenn ich das jetzt mal mache und auf https://www.geeksforgeeks.org/minde...d-command-limiting-search-specific-directory/
gehe.
Ich bin genauso schlau wie vorher...
Das Problem für mich an den Manual Seiten ist, das dort Optionen behandelt werden, die ich nicht brauche. Und die Optionen brauche (etwa Pfad einfügen, Dateityp einfügen), kriege ich nicht eingefügt bzw. der Befehl eignet sich dann einfach nicht in seiner ursprünglichen Struktur.*
Das ist bei mir jetzt nicht bei allen Anleitungen. Also zu Latex gucke ich mir sowas dauernd an, etwa LaTeX-Befehlsreferenz von Jürgen Weinelt macht mich meistens schlauer bzw. lässt mich an Dinge erinnern.

*Diese Art von Erklärung zu Terminalkommandos find ich nützlich:
https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/amp/
 
Zuletzt bearbeitet:
Zurück
Oben Unten