Suchen und Ersetzen in mehreren Dateien?
Hallo, ich möchte in mehreren Dateien Zeichenketten ändern. Bisher habe ich dafür immer sed verwendet, was aber den Nachteil hat, dass man relativ viel tippen muss und das ganze z.B. zusammen mit find recht unübersichtlich ist. Weiß jemand, ob bei SuSE ein einfaches Tool dabei ist, dass die besagte Aufgabe erfüllt und dazu nur drei Parameter (Datei, alte Zeichenkette, neue Zeichenkette) benötigt? TIA, Felix
"Felix E. Klee" schrieb:
Hallo,
ich möchte in mehreren Dateien Zeichenketten ändern. Bisher habe ich dafür immer sed verwendet, was aber den Nachteil hat, dass man relativ viel tippen muss und das ganze z.B. zusammen mit find recht unübersichtlich ist. Weiß jemand, ob bei SuSE ein einfaches Tool dabei ist, dass die besagte Aufgabe erfüllt und dazu nur drei Parameter (Datei, alte Zeichenkette, neue Zeichenkette) benötigt?
Hallo, wenn Du den komplette find / sed -Befehl kennst, könntest Du den in ein Shell-Script schreiben und nur die 3 benötigten Argumente in den Befehl einstanzen. Dann hast Du ein 'Programm' mit 3 Argumenten, und Du mußt nicht immer den ganzen Befehl eintippen. -- Grüße, Bert
Moin, * Felix E. Klee <felix.klee@inka.de> [01-08-30 21:11]:
Weiß jemand, ob bei SuSE ein einfaches Tool dabei ist, dass die besagte Aufgabe erfüllt Perl
und dazu nur drei Parameter (Datei, alte Zeichenkette, neue Zeichenkette) benötigt? NEdit möglicherweise, ich bin mir nicht sicher, ob 5.1.1 das schon konnte.
Thorsten -- Nicht die Blumen und Bäume, nur der Garten ist unser Eigentum.
On Thu, 30 Aug 2001, Felix E. Klee wrote:
ich möchte in mehreren Dateien Zeichenketten ändern. Bisher habe ich dafür immer sed verwendet, was aber den Nachteil hat, dass man relativ viel tippen muss und das ganze z.B. zusammen mit find recht unübersichtlich ist. Weiß jemand, ob bei SuSE ein einfaches Tool dabei ist, dass die besagte Aufgabe erfüllt und dazu nur drei Parameter (Datei, alte Zeichenkette, neue Zeichenkette) benötigt?
Nicht ganz das, was gewünscht: perl -pi -e 's/alt/neu/eg' /pfad/dateien* Gruss Friedhelm
* Felix E. Klee schrieb am 30.Aug.2001:
ich möchte in mehreren Dateien Zeichenketten ändern. Bisher habe ich dafür immer sed verwendet, was aber den Nachteil hat, dass man relativ viel tippen muss und das ganze z.B. zusammen mit find recht unübersichtlich ist. Weiß jemand, ob bei SuSE ein einfaches Tool dabei ist, dass die besagte Aufgabe erfüllt und dazu nur drei Parameter (Datei, alte Zeichenkette, neue Zeichenkette) benötigt?
Ich verstehe nicht ganz wo das Problem ist. sed s/alte Zeichenkette/neue Zeichekette/g Datei tuts doch. Da brauchst Du doch kaum mehr anzugeben, als das was unbedingt notwendig ist. Was machst Du mit find? Nicht falsch verstehen, kann durchaus sinnvoll sein, aber ich vermute mal, daß Du da noch mehr machst als Du sagst. Der Tipp ein eigenes, kleines Skript dafür zu schreiben hast Du ja schon bekommen. Ich würde dabei Datei als letztes angeben, dann kannst Du das Skript auch so schreiben, daß man mehere Dateien angeben kann. Bernd -- LILO funktioniert nicht? Hast Du /etc/lilo.conf verändert und vergessen, lilo aufzurufen? Ist Deine /boot-Partition unter der 1024 Zylindergrenze? Bei anderen LILO Problemen mal in der SDB nachschauen: http://localhost/doc/sdb/de/html/rb_bootdisk.html |Zufallssignatur 6
On Fri, 31 Aug 2001, Bernd Brodesser wrote:
* Felix E. Klee schrieb am 30.Aug.2001:
ich möchte in mehreren Dateien Zeichenketten ändern. Bisher habe ich dafür immer sed verwendet, was aber den Nachteil hat, dass man relativ viel tippen muss und das ganze z.B. zusammen mit find recht unübersichtlich ist.
Nein, unuebersichtlich ist das wirklich nicht, es sei denn, Du hast Ersetzungen vorzunehmen, die Du uns naeher schildern solltest, die auf Grund ihrer Komplexitaet Dir mit "sed" Kopfzerbrechen bereiten. Eine Alternative ist fuer DIch daher vielleicht Perl, wo manches einfacher als mit sed erscheint - was auch eine Frage der Gewoehnung sein kann.
sed s/alte Zeichenkette/neue Zeichekette/g Datei
Und dieser Befehl hat auch noch den Vorteil, dass das Ergebnis auf STDOUT geht und die Datei selber gar nicht erst angreift. Im Falle eines womoeglichen Fehlers ist das naemlich sehr wichtig. Gruss Peter Blancke -- Nachtwaechter ist der Wahnsinn, weil er wacht...
Peter Blancke wrote:
ich möchte in mehreren Dateien Zeichenketten ändern. Bisher habe ich dafür immer sed verwendet, was aber den Nachteil hat, dass man relativ viel tippen muss und das ganze z.B. zusammen mit find recht unübersichtlich ist.
Nein, unuebersichtlich ist das wirklich nicht, es sei denn, Du hast Ersetzungen vorzunehmen, die Du uns naeher schildern solltest, die auf Grund ihrer Komplexitaet Dir mit "sed" Kopfzerbrechen bereiten.
Den Nachteil von sed finde ich, dass es Suchen und Ersetzen mit Regular-Expressions vornimmt und ich dann in komplizierten Strings einiges quoten muss. Kann ich die Regular-Expressions in den besagten perl- oder sed-Scripten irgendwie ausschalten? Felix
Am Fre, 31 Aug 2001, schrieb Felix E. Klee:
Peter Blancke wrote:
ich möchte in mehreren Dateien Zeichenketten ändern. Bisher habe ich dafür immer sed verwendet, was aber den Nachteil hat, dass man relativ viel tippen muss und das ganze z.B. zusammen mit find recht unübersichtlich ist.
Nein, unuebersichtlich ist das wirklich nicht, es sei denn, Du hast Ersetzungen vorzunehmen, die Du uns naeher schildern solltest, die auf Grund ihrer Komplexitaet Dir mit "sed" Kopfzerbrechen bereiten.
Den Nachteil von sed finde ich, dass es Suchen und Ersetzen mit Regular-Expressions vornimmt und ich dann in komplizierten Strings einiges quoten muss. Kann ich die Regular-Expressions in den besagten perl- oder sed-Scripten irgendwie ausschalten?
Verstehe ich nicht so ganz. Wenn Du viele Slashes ersetzen willst, kannst Du die einzelnen Abschnitte des substitute-Kommandos von sed z.B. durch # trennen. Außerdem hast Du mit RegExp doch gerade die möglichkeit, längere Abschnitte zu matchen und die Matches im "Ersetze-Teil" wieder zu referenzieren. Gerade wenn das komplizierte Strings sind, sind RexExpressions IMHO die beste Wahl. Aber vielleicht kannst Du mal ein Beispiel posten. Gruß Christoph -- Christoph Maurer - Paul-Röntgen-Straße 7 - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
* Felix E. Klee schrieb am 31.Aug.2001:
Den Nachteil von sed finde ich, dass es Suchen und Ersetzen mit Regular-Expressions vornimmt und ich dann in komplizierten Strings einiges quoten muss. Kann ich die Regular-Expressions in den besagten perl- oder sed-Scripten irgendwie ausschalten?
Warum willst Du das? Regular-Expressions sind doch eine tolle Sache, damit kanst Du Dir vieles leichter machen. Abgesehen davon stehen Buchstaben und Zahlen für sich. Probleme gibt es nur bei Klammern, Stern, Pluszeichen und Punkt. Da macht man ein Backslash \ vor und gut ist. Vor dem Backslash selber auch. Und auch nur im Suchteil. Bernd
Bernd Brodesser wrote:
Den Nachteil von sed finde ich, dass es Suchen und Ersetzen mit Regular-Expressions vornimmt und ich dann in komplizierten Strings einiges quoten muss. Kann ich die Regular-Expressions in den besagten perl- oder sed-Scripten irgendwie ausschalten?
Warum willst Du das? Regular-Expressions sind doch eine tolle Sache, damit kanst Du Dir vieles leichter machen.
Ich brauche sie aber nur äußerst selten.
Abgesehen davon stehen Buchstaben und Zahlen für sich. Probleme gibt es nur bei Klammern, Stern, Pluszeichen und Punkt. Da macht man ein Backslash \ vor und gut ist. Vor dem Backslash selber auch. Und auch nur im Suchteil.
Z.B. bei längeren C-Fragmenten ist dies störend, denn da tauchen häufig Klammern, Sterne, Pluszeichen und Punkte auf. Gibt es denn keine Möglichkeit Regular-Expressions in sed oder perl auszustellen oder wenigstens den gesamten Such-String zu quoten? Felix
Moin, * Felix E. Klee <felix.klee@inka.de> [01-08-31 14:20]:
Z.B. bei längeren C-Fragmenten ist dies störend, denn da tauchen häufig Klammern, Sterne, Pluszeichen und Punkte auf. Gibt es denn keine Möglichkeit Regular-Expressions in sed oder perl auszustellen oder wenigstens den gesamten Such-String zu quoten? Du solltest Dir definitiv NEdit ansehen, am besten den Release Candidate, der heute oder morgen veröffentlicht wird. Damit kannst Du in mehreren Dateien suchen/ersetzen und Dir aussuchen, ob Du Regexe benutzt oder nicht.
ftp://nedit.soureforge.net/pub/nedit/5-2-BETA/executables Thorsten -- As long as people will accept crap, it will be financially profitable to dispense it. Dick Cavett
Thorsten Haude wrote:
* Felix E. Klee <felix.klee@inka.de> [01-08-31 14:20]:
Z.B. bei längeren C-Fragmenten ist dies störend, denn da tauchen häufig Klammern, Sterne, Pluszeichen und Punkte auf. Gibt es denn keine Möglichkeit Regular-Expressions in sed oder perl auszustellen oder wenigstens den gesamten Such-String zu quoten? Du solltest Dir definitiv NEdit ansehen, am besten den Release Candidate, der heute oder morgen veröffentlicht wird. Damit kannst Du in mehreren Dateien suchen/ersetzen und Dir aussuchen, ob Du Regexe benutzt oder nicht.
Ich glaube kaum, dass ich damit die Suchen und Ersetzen-Funktion, wie von mir gewünscht, von der Kommandozeile mit drei Parametern aufrufen kann, oder doch? Felix
Moin, * Felix E. Klee <felix.klee@inka.de> [01-08-31 16:35]:
Thorsten Haude wrote:
Du solltest Dir definitiv NEdit ansehen, am besten den Release Candidate, der heute oder morgen veröffentlicht wird. Damit kannst Du in mehreren Dateien suchen/ersetzen und Dir aussuchen, ob Du Regexe benutzt oder nicht. Ich glaube kaum, dass ich damit die Suchen und Ersetzen-Funktion, wie von mir gewünscht, von der Kommandozeile mit drei Parametern aufrufen kann, oder doch? Ich kann nicht mehr folgen. Von der Kommandozeile aus geht's mit Perl oder sed, NEdit ist eine Editor, der das unnötig macht, weil man die gleiche Funktionalität einfacher bekommt.
Was suchst Du eigentlich? Thorsten -- Don't panic.
Am Fre, 31 Aug 2001, schrieb Felix E. Klee:
Bernd Brodesser wrote:
Den Nachteil von sed finde ich, dass es Suchen und Ersetzen mit Regular-Expressions vornimmt und ich dann in komplizierten Strings einiges quoten muss. Kann ich die Regular-Expressions in den besagten perl- oder sed-Scripten irgendwie ausschalten?
Warum willst Du das? Regular-Expressions sind doch eine tolle Sache, damit kanst Du Dir vieles leichter machen.
Ich brauche sie aber nur äußerst selten.
Ich möchte sie nicht mehr missen, einen sehr guten Artikel zu Regular Expressions gibt es übrigens in der aktuellen iX
Abgesehen davon stehen Buchstaben und Zahlen für sich. Probleme gibt es nur bei Klammern, Stern, Pluszeichen und Punkt. Da macht man ein Backslash \ vor und gut ist. Vor dem Backslash selber auch. Und auch nur im Suchteil.
Z.B. bei längeren C-Fragmenten ist dies störend, denn da tauchen häufig Klammern, Sterne, Pluszeichen und Punkte auf. Gibt es denn keine Möglichkeit Regular-Expressions in sed oder perl auszustellen oder wenigstens den gesamten Such-String zu quoten?
Baue Dir doch ein kleines Perl-Skript, das z.B. von STDIN liest, alle Sonderzeichen im Sinne einer RegExp maskiert und das ganze wieder ausgibt. Dann ist das Problem gelöst, wenn Du das öfter brauchst, wenn's nur einmal ist, sind die paar Backslashes zu verkraften. Gruß Christoph -- Christoph Maurer - Paul-Röntgen-Straße 7 - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
Christoph Maurer wrote:
Z.B. bei längeren C-Fragmenten ist dies störend, denn da tauchen häufig Klammern, Sterne, Pluszeichen und Punkte auf. Gibt es denn keine Möglichkeit Regular-Expressions in sed oder perl auszustellen oder wenigstens den gesamten Such-String zu quoten?
Baue Dir doch ein kleines Perl-Skript, das z.B. von STDIN liest, alle Sonderzeichen im Sinne einer RegExp maskiert und das ganze wieder ausgibt. Dann ist das Problem gelöst, wenn Du das öfter brauchst, wenn's nur einmal ist, sind die paar Backslashes zu verkraften.
So ein Skript sollte definitiv bei SuSE mitgeliefert werden. Gibt es es vielleicht irgendwo im Netz? Felix
Am Fre, 31 Aug 2001, schrieb Felix E. Klee:
Christoph Maurer wrote:
Z.B. bei längeren C-Fragmenten ist dies störend, denn da tauchen häufig Klammern, Sterne, Pluszeichen und Punkte auf. Gibt es denn keine Möglichkeit Regular-Expressions in sed oder perl auszustellen oder wenigstens den gesamten Such-String zu quoten?
Baue Dir doch ein kleines Perl-Skript, das z.B. von STDIN liest, alle Sonderzeichen im Sinne einer RegExp maskiert und das ganze wieder ausgibt. Dann ist das Problem gelöst, wenn Du das öfter brauchst, wenn's nur einmal ist, sind die paar Backslashes zu verkraften.
So ein Skript sollte definitiv bei SuSE mitgeliefert werden. Gibt es es vielleicht irgendwo im Netz?
Wo ist das Problem? Wenn es um die reine Funktionalität geht, alle Sonderzeichen in einem übergebenen String zu maskieren, kannst Du das mit einer intelligenten oder mehreren Ersetzungen lösen. Du mußt nur wissen, welche Zeichen Sonderzeichen sind und maskiert werden müssen. Das hängt jedoch davon ab, mit welchem Programm Du Deinen so bearbeiteten RegEx-String weiterverwenden willst, da z.B. emacs ein ( anders interpretiert als vi. (Das Problem dabei ist, daß es zwei Typen von regulären Ausdrücken gibt, Basic Regular Expressions und Extended Regular Expressions. Ein entsprechendes Skript muß deshalb auf die Anwendung zugeschnitten sein (okay, man kann das über Parameter oder so lösen) Schau mal auf den Seiten www.heise.de/iX, da gab es einen sehr informativen und ausführlichen Artikel dazu. Jehr mehr ich jedoch über Deinen Einsatzzweck nachdenke, desto sinnvoller erscheint mir die Verwendung regulärer Ausdrücke, nicht ein bloßes Pattern Matching: Beispiel: (Du schreibst, Du willst C-Fragmente ersetzen) In C ist main(int argc, char* argv[]) und main (int argc, char* argv[]) das gleiche Mit RegEx bekommst Du das gematcht, mit simplen Patterns nicht so richtig... Gruß Christoph -- Christoph Maurer - Paul-Röntgen-Straße 7 - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
participants (7)
-
B.Brodesser@t-online.de
-
Bert Blümer
-
Christoph Maurer
-
Felix E. Klee
-
Friedhelm Mueller
-
Peter Blancke
-
Thorsten Haude