String in mehreren Dateien ersetzen

whitey schrieb:
Ich nochmal :(

Die zweite Variante von Wolfgang gibt bei mir folgende Fehlermeldung aus:

Code:
Variable length lookbehind not implemented in regex; marked by <-- HERE in m/(?<![\w_\-@#.].*?)subdomain\.domainname\.org <-- HERE / at -e line 1.

Ja klar, ich habe nur die von Phorus korrigiert und diesen Fehler nicht gesehen.
(?<!...) gibt es nicht, ist aber hier auch nicht nötig.
Der string funktioniert bei deiner Konstellation ohnehin nicht.
eher so ~s|(.*?\W+?)subdomain\.domainname\.org\b(.*)$|$1neue-subdomain.domainname\.org$2|ig

aber selbst der ist nicht perfekt.
Siehe mein anderes Posting.
Gruß Wolfgang
 
Wolfgang_1 schrieb:
Ähm will ja nicht altklug sein, aber das matcht unter Umständen zu viel weg, (greedy-modus) ;)

Ich hab auch nochmal ne Frage. Da lookbehind mit festen Stringlängen arbeitet (daher auch der Fehler bei ".*?"), sollte es garnicht zu endlosen Matchen kommen. perl fängt am Anfang des Strings an, schaut, ob das erste Zeichen in [\w_\-@#.] liegt und geht dann sofort dazu über, den nachfolgenden String auf Gleichheit mit "subdomain..." zu prüfen.

Korrigiere mich bitte, falls ich da falsch denke.

Gruss, Phorus
 
Hallo
Dein Lookbehind matcht auf alles was (nicht):
Wortzeichen oder - oder # oder @ oder . gefolgt von subdomain gefolgt von . domain gefolgt von . gefolgt von org findet.
Dass der Punkt geschützt werden muss ist ja klar.
Kommt nun z.B. in subdomain ein Unterstrich, wird der nächste Punkt gefressen.
Deshalb mein Vorschlag mit dem non-greedy Modus, was natürlich so nicht zusammenpasst.
Aber ich hatte leider übersehen, dass du ja garnicht ersetzt, sondern nur matcht, deshalb würde das nichts in der Datei ändern.

cu Wolfgang
PS Ist subdomain hier ein fester String oder ist der variabel?
Wenn subdomain ein fester String ist, wird das natürlich viel einfacher.
 
Guten Morgen,

ja, subdomain ist ein fester String. Jedoch koennte die Subdomain

zb. nix.unixboard.de heissen, oder auch u-nix.unixboard.de heissen.
Daher will ich einige zeichen ausklammern. Sonst wuerde aus u-nix.unixboard.de ein u-neu-nix.unixboard.de ebenso die topleveldomain koennte variieren (de org net etc...).

Es waere toll wenn ihr mir euren einzeiler und auch deine Variante Wolfgang naeher erklaeren koenntet.

Wozu werden zB die geschweiften Klammern und der slash benoetigt ?
{} \;
 
Hallo

whitey schrieb:
Guten Morgen,

ja, subdomain ist ein fester String. Jedoch koennte die Subdomain

zb. nix.unixboard.de heissen, oder auch u-nix.unixboard.de heissen.
Daher will ich einige zeichen ausklammern. Sonst wuerde aus u-nix.unixboard.de ein u-neu-nix.unixboard.de ebenso die topleveldomain koennte variieren (de org net etc...).
Na dann wird das viel einfacher:

Zuerst eine Schleife, um alle Dateien zu erfassen, in denen ersetzt werden soll.

Variante 1:

find /rootpfad/ -type f -iname "*html" -exec echo {} \;

Find sucht alle Dateien die auf html enden, egal ob Html oder HTmL ( Option -iname).
Hinter dem -exec wird mit diesen Dateien ein Kommando ausgeführt. Hier beispielsweise mal echo, was nur die gefundenen Dateien ausgibt. Die {} repräsentieren dabei den von find gelieferten Dateinamen. Das \; schützt das Semikolon vor der Shell, die dieses sonst vor dem Befehl interpretieren würde.
-exec würde sonst den Befehl nicht erkennen. Probier es aus und schau dir mal man find an :rtfm:
whitey schrieb:
Es waere toll wenn ihr mir euren einzeiler und auch deine Variante Wolfgang naeher erklaeren koenntet.

Wozu werden zB die geschweiften Klammern und der slash benoetigt ?
{} \;
siehe oben:

Eine andere Variante alle Dateien zu finden ist etwas in dieser Art:

Variante 2:
Das $(..) liefert hier eine Liste der Dateien, dessen Wert bei jedem Durchlauf von i angenommen wird.

for i in $(find /pfad -type f -iname "*html"); do
echo $i; done


Macht also das Gleiche wie oben, mit dem Unterschied dass die Prozesse nacheinander gestartet werden- was bei sehr vielen Dateien sinnvoll ist.
Auch eine Möglichkeit mit xargs ist dafür geeignet, besonders mit Leerzeichen in Dateinamen zu empfehlen!
siehe man xargs
Variante 3:

find /pfad -type f -iname "*html" -print0|xargs -0 -n1 echo

Was -print0 und xargs -0 macht, verrät dir die manpage ;)

So nun ersetzen wir einfach das echo von oben durch unseren Perleinzeiler.


Wenn du also jegliches Vorkommen von subdomain ändern willst, und subdomain ist dir als fester string bekannt, ist es ganz simpel.
Ich verwende mal Variante 2

Code:
for i in $(find /pfad -type f -iname "*html" ); do
perl -pi -e '~s!subdomain!neue-subdomain!ig' $i
done;

Wenn du aber die neu-subdomain teilweise schon in deinen Dateien stehen hast, und diese ausschließen willst geht der perl-Einzeiler so
Code:
perl -pi -e '~s!subdomain!neue-subdomain!ig unless($_=~/neue-subdomain/ig)' $i
Thats all folks :D
Gruß Wolfgang
 
Danke dir sehr Wolfgang.

Das war gut verstaendlich.
Jetzt werde ich ersteinmal mit all dem ein wenig herumspielen und ausprobieren ob ich alles richtig verstanden habe.
Ich denke euren Ausfuehrungen gibt es nichts mehr hinzuzufuegen, es sei denn ich stell mich zu bloed an :)

lg
whitey
 
Wolfgang_1 schrieb:
...
Kommt nun z.B. in subdomain ein Unterstrich, wird der nächste Punkt gefressen.
...

Hallo Wolfgang,

an die Sonderzeichen in der subdomain hab ich garnicht gedacht. Punkt für Dich.

Gruss, Phorus

p.s.: Danke, dass Du das Erklären übernommen hast.
 
Phorus schrieb:
Hallo Wolfgang,

an die Sonderzeichen in der subdomain hab ich garnicht gedacht. Punkt für Dich.

Gruss, Phorus

p.s.: Danke, dass Du das Erklären übernommen hast.
Na aber Hallo
es geht doch garnicht um Punkte, sondern dass wir hier möglichst kompetent helfen.
Ich bin auch nicht fehlerfrei -oft betriebsblind - und erwarte dann auch korrigiert zu werden.
;)
In diesem sinne miteinander, nicht gegeneinander.
Denke nicht, dass wir uns etwas beweisen müssen.
Gruß Wolfgang
 
:oldman
Wenn man ofter Zeichenketten in mehreren Dateien ersetzen will ist
doch eine Textverarbeitung mit der Option "Ersetze in Dateien"
sehr sinnvoll.

Habe selbst danach gesucht und auch welche für Linux gefunden und benutzt:
1.) "Cream" (Aus der Familie vi, vim,...)
2.) Kdevelop
 
Wolfgang_1 schrieb:
In diesem sinne miteinander, nicht gegeneinander.
Denke nicht, dass wir uns etwas beweisen müssen.
Gruß Wolfgang

Das hast Du falsch verstanden, es war nur ein plumper Versuch eines Kompliments ;)

Da ich Perl "by doing" lerne, bin ich über jeden Hinweis dankbar.

ub_proteus schrieb:
Wenn man ofter Zeichenketten in mehreren Dateien ersetzen will ist doch eine Textverarbeitung mit der Option "Ersetze in Dateien" sehr sinnvoll.

Das denke ich aber anders. Wenn man erstmal ein Skript geschrieben hat, ist das Modifizieren ziemlich einfach. Davon abgesehen wüsste ich nicht, wie man mit einem Editor alle Dateien in einem Verzeichnis (nebst Unterverzeichnissen) gleichzeitig bearbeiten kann. regular expressions kann man mit den meisten Editoren auch vergessen (gut, Bluefish kann die, vi, emacs wahrscheinlich auch).

Gruss Phorus

edit: Hmm, lesen muss man können. Vergesst meinen letzten Absatz :D
 
Zuletzt bearbeitet:
Das denke ich aber anders. Wenn man erstmal ein Skript geschrieben hat, ist das Modifizieren ziemlich einfach.
Jedem seine Meinung. Dann wirst du wahrscheinlich auch statt der "Suche" Funktion in Textverarbeitungen deine Skripte benutzen?
Warum nicht ganz auf Textverarbeitungen verzichten? Zeichen lassen sich auch in der Kommandozeile einer Datei hinzufügen.

Davon abgesehen wüsste ich nicht, wie man mit einem Editor alle Dateien in einem Verzeichnis (nebst Unterverzeichnissen) gleichzeitig bearbeiten kann.
Gruss Phorus

Dann solltest du es einmal versuchen, nur so gewinnt man Erfahrung.
Tipp: ist sogar das Standardverhalten. :D
 
Eine Minute vor Deinem Post hab ich meine Meinung revidiert :D

Es kommt halt immer auf den Nutzen an. Wenn ein File (ein Log-File zum Beispiel) automatisch geparst werden soll, wenn nur eine Shell zur Verfügung steht oder wenn man einfach zu faul ist (so wie ich), hundert verschiedene Syntaxe zu lernen -> dann sind Skripte nicht falsch.

Gruss, Phorus

p.s.: Editieren tu ich trotzdem mit meinem heissgeliebten Bluefish ;)
 
Schoene Grundsatzdiskussion :)

Wenn die Dateien nicht auf meinem Rechner liegen und sich auch schon mal ueber nacht aendern... (mehr werden oder weniger... ) dann bin ich froh das ich ueber die Shell mit einem einzeiler fix eingreifen kann.

Wenn ich lange rumtuefteln muss wuensch ich mir dann und wann auch eine GUI die mir das Ergebnis visualisiert.
 
Hallo
Ein Texteditor ist im Normalfall dazu da Texte zu erstellen.
Um aber Texte nach einem bestimmten Muster in vielen Dateien zu verändern, sind diverse schnell abgeschossene Einzeiler ideal.

Um zum Beispiel in meiner /etc/fstab etwa alle hda1 zu hda5 zu machen,
habe ich viel schneller
perl -pi -e'~s/hda1/hda5/g' /etc/fstab
geschrieben, als ich erst vim starte, die Stelle suche , die Datei editiere und speichere. Ausserdem gehe ich sicher, auch alle Stellen erwischt zu haben.

Ich weiss, auch vim lässt sich per Makro automatisieren.

Ausserdem sind solche Einzeiler scriptfähig, was beim Automatisieren von Aufgaben unverzichtbar ist.

Der Vorteil ist aber noch größer, wenn ich auf einem Remotesystem per ssh eingelogt bin.
Nahezu jedes *nixoide System hat perl, sed, awk zur Verfügung.

Ich kann also sofort meine Aufgabe erledigen, ohne auf eine GUI oder bestimmte Software angewiesen zu sein.

Jeder nutzt das, womit er die Aufgabe am effizientesten lösen kann.
Für mich ist das gerade bei Textbearbeitung perl.
Bei den REGEXPR. weiss ich so, was ich nutzen kann was bei den verschiedenen Versionen von sed, grep und co nicht immer gleich ist.

Das meine 2¢ dazu
Gruß Wolfgang
PS Übrigens klassisches Beispiel, wo man ohne GUI eine Datei simpel editieren muss ist XFree86. Wenn der mal nicht mehr startet, stehen viele dumm da ohne Kate und co. wenigstens vim sollte man dann bedienen können.
 
Und ausserdem stehen die Mädels auf kryptische Einzeiler, Dude ;)
 
Die beiden Textverarbeitungen die "Suchen und Ersetzen in Dateien"
beherschen habe ich genannt um anderen eine Suche danach zu
ersparen.
Mehr nicht!

Genau soetwas habe ich gesucht um ein Projekt das ich für die
Windows Umgebung geschrieben hatte, bestehend aus etwa
100 Dateien Quellcode, nach Linux zu portieren.
Insbesondere wichtig war die Möglichkeit interaktiv, je nach
Fall, in bestimmten Dateien und an bestimmten Stellen
Ersetzungen durchzuführen oder auch nicht. Welche Fälle dabei
auftreten kann sich jeder vorstellen:
- unterschiedliche "Zwischenräume /Zeilenumbruch (Syntax korrekt aber Strings nicht gleich),
- Unterscheidung bereits geänderter Abschnitte/Dateien vs. zu Ändernden,
- gleiche Strings die aber unterschiedlich behandelt werden müsse,
- usw.
Das ein trivialer Einzeiler es hier nicht tut, weil eine
Beurteilung im Kontext erforderlich ist, dürfte klar sein.

Dennoch wäre ich mal gespannt wie eine solche Aufgabe mit einem
Einzeiler, von deren exklusiven Anhängern, in Angriff genommen
wird. :D

Es liegt mir fern etwas gegen shell-Befehle und gnu-Werkzeuge
zu sagen, ich nutze sie selbst ausgiebig, stellen sie doch eine
große Stärke der UNIX Betriebsysteme dar. Vor allem für
Administrationsaufgaben sind sie sehr nützlich.

Etwas seltsam ist es jedoch wenn man nach Nennung von zwei
Programmen von Anhänger der "ich mach alles in der Kommandozeile"
angegriffen wird als ob man ihnen ihr Lieblingsspielzeug
wegnehmen will. Keine Sorge. :headup:

Wolfgang_1
Hallo
Ein Texteditor ist im Normalfall dazu da Texte zu erstellen.

Super! Villeicht können wir es weiter einschränken auf die
Textgattung "Romane" oder deren Untergattung "Liebesromane".
Aus irgendeinem Grund ziehe ich es vor meinen Quellcode mit
einem Texteditor zu schreiben, obwohl das sicher auch mir sed,
awk, cat, perl, usw möglich ist.


Wolfgang_1
...ist XFree86. Wenn der mal nicht mehr startet, stehen viele
dumm da ohne Kate und co. wenigstens vim sollte man dann bedienen können.

Seit wann genau ist vim kein Texteditor mehr?

Wolfgang_1
Um zum Beispiel in meiner /etc/fstab ...,
habe ich viel schneller
perl -pi -e'~s/hda1/hda5/g' /etc/fstab

Jetzt habe ich beinahe Kaffee auf der Tastatur. :D
 
ub_proteus schrieb:
Die beiden Textverarbeitungen die "Suchen und Ersetzen in Dateien"
beherschen habe ich genannt um anderen eine Suche danach zu
ersparen.
Mehr nicht!

Ja, und wir haben nur den Nutzen und den Sinn von Shell-Skripten genannt. Mehr nicht!

ub_proteus schrieb:
Genau soetwas habe ich gesucht um ein Projekt das ich für die
Windows Umgebung geschrieben hatte, bestehend aus etwa
100 Dateien Quellcode, nach Linux zu portieren.
Insbesondere wichtig war die Möglichkeit interaktiv, je nach
Fall, in bestimmten Dateien und an bestimmten Stellen
Ersetzungen durchzuführen oder auch nicht. Welche Fälle dabei
auftreten kann sich jeder vorstellen:
- unterschiedliche "Zwischenräume /Zeilenumbruch (Syntax korrekt aber Strings nicht gleich),
- Unterscheidung bereits geänderter Abschnitte/Dateien vs. zu Ändernden,
- gleiche Strings die aber unterschiedlich behandelt werden müsse,
- usw.
Das ein trivialer Einzeiler es hier nicht tut, weil eine
Beurteilung im Kontext erforderlich ist, dürfte klar sein.

Dennoch wäre ich mal gespannt wie eine solche Aufgabe mit einem
Einzeiler, von deren exklusiven Anhängern, in Angriff genommen
wird. :D

Völlig aus der Luft gegriffen. Nirgendswo oben im Thread, der übrigens im "Shell-Skripte"-Abschnitt des Forums steht, ging es um "interaktives" Ersetzen. Wo die Grenzen der Shell-Skripte sind: keine Angst, die kenn ich. Alle oben genannten Anfragen hatten ein nachvollziehbares und klar definiertes Suchschema und legen die Anwendung eines Shell-Skriptes nahe. Klar, dass man damit nicht unterscheiden kann zwischen Vogelbauer und dem Mann mit den dicken Kartoffeln. Das hat aber niemand behauptet.

Bei Deinem Beispiel versagen natürlich die Shellskripte. Genauso, wie Dein Editor bei der Aufgabe, "Suchen, Ersetzen und Kaffeekochen" versagen würde. ;)

Gruss Phorus
 
Zuletzt bearbeitet:
Phorus

Ja, und wir haben nur den Nutzen und den Sinn von Shell-Skripten genannt. Mehr nicht!

Mit wir meinst du wohl dich und wolfgang_1.

Schade. Lesen muß man aber können.
Im Gegenteil: zumindest in den an mich gerichteten Antworten wurde kleinsektiererisch auf die Überlegenheit von Einzeilern gepocht. Von Shell-Skripten war gar nicht die Rede. Und selbst wenn war das ein schönes Beispiel über deren Grenzen.

Die Logik bleibt dabei auch im Keller. Keine Not darauf einzugehen, Beitrag steht ja noch da.

Phorus
Völlig aus der Luft gegriffen. Nirgendswo oben im Thread, der übrigens im "Shell-Skripte"-Abschnitt des Forums steht, ging es um "interaktives" Ersetzen.

Ziemlich schwach. Ebenfalls keine Not darauf einzugehen.

Phorus
Und ausserdem stehen die Mädels auf kryptische Einzeiler, Dude

Genau. Viel Erfolg.
 
ub_proteus schrieb:
...
Schade. Lesen muß man aber können.

Ist bestimmt kein Nachteil. Ich weise mal auf meinen Post #32, denn da kann man lesen:

Phorus schrieb:
Eine Minute vor Deinem Post hab ich meine Meinung revidiert :D
...

Im Post #30 findet man dann auch
Phorus schrieb:
...
edit: Hmm, lesen muss man können. Vergesst meinen letzten Absatz :D

Also der Fehler des falsch Lesens lag eindeutig bei mir. Als das ganze dann weiterlief, dachte ich mir: Egal, wird vielleicht 'ne interessante Diskussion. Leider artet es mittlerweile derart aus, dass ichs dem Mod nicht verübeln könnte, wenn er den Thread in den Sandkasten verschiebt. Um dem ganzen einen Riegel vorzuschieben, würde ich ein Ende vorschlagen, auch wenn ich Deine schnippischen Kommentare, entstanden wahrscheinlich aus einem persönlich angegriffen fühlen, belustigend finde.

Phorus schrieb:
Und ausserdem stehen die Mädels auf kryptische Einzeiler, Dude

Der Satz ist in lustiger Runde aus einer Weinlaune heraus entstanden und ist (selbst)ironisch gemeint. Aber fühl Dich ruhig bestätigt.
 
Hallo
Mir sind derartige von verletzter Eitelkeit strotzende Postings wie das von ub_proteus
zu unwichtig, um darauf näher einzugehen.
Unklar wo und warum sich dieser Bub verletzt fühlt.

Aber hier mein einziges und letztes direktes Posting dazu:

@ub_proteus
Geantwortet habe ich jedenfalls nicht auf dein Posting, lediglich meine Meinung zu
Einzeilern und deren Nützlichkeit insbesondere im Zusammenhang mit administrativen Aufgaben.

Hallo ub_proteus wir sind hier im Forum Shell-Skripte.

Jedenfalls kann ich nirgends lesen, behauptet zu haben alles über Einzeiler zu erledigen.
Quellcode (ob für Wintendo oder nicht) ist letztendlich auch nur Text, den auch ich mit vi erstelle. Etwas anderes habe ich nirgendwo behauptet.

Vermutlich steckt bei dir eine latente Angst vor der Konsole dahinter.
Anders ist es nicht erklärbar wie du auf so obskure Schlussfolgerungen und Behauptungen kommst, ja dich überhaupt angegriffen fühlst.

Also nimm deine Programme für was du willst, ich jedenfalls spüre keine Lust zu missionieren.

Ich verwende meine Werkzeuge, und helfe wenn ich diesbezüglich gefragt werde - und kann. Rechtfertigen muss ich das vor Niemanden.

Nochmal: Hier ist ein Forum für Shell-Skripte auf *nixoiden Systemen!

Wenn du deine Programme anbieten willst, tu das im Bereich Anwendungen.

So, nun komm wieder runter, atme tief durch und lies noch mal in alller Ruhe was hier steht. Dann wird dir eventuell bewusst, dass du hier einen Kleinkrieg anfangen wolltest, den ausser dir keiner hier will.

Gruß Wolfgang
 

Ähnliche Themen

Skript last_login

Strings ersetzen

[PERL] Mit Regex kompletten String durchsuchen und ersetzen

CGI laesst sich nicht ausfuehren

VirtualBox rpm.run

Zurück
Oben