Wenden Sie die Regular Expression Ersetzung global auf viele Dateien mit einem Skript an

7

Ich möchte eine bestimmte reguläre Ausdrucksersetzung global auf etwa 40 Javascript-Dateien in und unter einem Verzeichnis anwenden. Ich bin ein vim-Benutzer, aber das von Hand zu tun kann langwierig und fehleranfällig sein, daher möchte ich es mit einem Skript automatisieren.

Ich habe versucht, sed, aber die Behandlung von mehr als einer Zeile zu einer Zeit ist peinlich, vor allem, wenn es keine Begrenzung gibt, wie viele Zeilen das Muster übereinstimmen könnte.

Ich habe auch dieses Skript (in einer einzigen Datei zum Testen) ausprobiert:

%Vor%

Das Muster löscht ein abschließendes Komma in einer Perl / Ruby-Stil-Liste, so dass "[a, b, c,]" als "[a, b, c]" ausgegeben wird, um Internet Explorer zu erfüllen , die allein unter Browsern auf solchen Listen erstickt.

Das Muster funktioniert wunderbar in vim, tut aber nichts, wenn ich es in ex ausführe, wie im obigen Skript beschrieben.

Kann jemand sehen, was ich vermisse?

    
Lawrence I. Siden 12.07.2010, 02:14
quelle

5 Antworten

12

Sie haben nach einem Skript gefragt, aber Sie haben erwähnt, dass Sie vim user sind. Ich tendiere dazu, projektweit innerhalb von vim zu suchen und zu ersetzen, so:

%Vor%

Dies ist der von einem anderen Kommentator erwähnten :bufdo -Lösung sehr ähnlich, aber es wird Ihre Argumentliste und nicht Ihre Bufliste verwenden (und erfordert somit keine brandneue vim-Sitzung, noch dass Sie beim Schließen von Puffern vorsichtig sind du willst nicht berührt werden).

  • :args **/*.js - setzt Ihre Argumentliste so, dass sie alle .js-Dateien in diesem Verzeichnis und in den Unterverzeichnissen
  • enthält
  • | - pipe ist das Befehlseparator von vim, mit dem wir mehrere Befehle in einer Zeile haben können
  • :argdo - Führe den / die folgenden Befehl (e) für alle Argumente aus. es wird nachfolgende Rohre "verschlingen"
    • % - ein Bereich, der die gesamte Datei darstellt
    • :s - Ersetze Befehl, den du bereits über
    • kennst
    • :s_flags , ge - global (so oft wie möglich pro Zeile ersetzen) und Fehler unterdrücken (d. h. "Keine Übereinstimmung")
    • | - Diese Pipe wird von :argdo "verschluckt", so dass der folgende Befehl auch einmal pro Argument
    • ausgeführt wird
    • :update - wie :write , aber nur wenn der Puffer geändert wurde

Dieses Muster funktioniert natürlich für jeden vim-Befehl, den Sie auf mehreren Dateien ausführen möchten, also ist es ein praktischer zu beachten. Zum Beispiel verwende ich es, um nachlaufende Leerzeichen ( %s/\s\+$// ) zu entfernen, einheitliche Zeilenenden ( set ff=unix ) oder Dateikodierungen ( set filencoding=utf8 ) und retab meine Dateien zu setzen.

    
nicholas a. evans 15.07.2010, 18:23
quelle
5

1) Öffnen Sie alle Dateien mit vim:

%Vor%

2) Wenden Sie den Ersatzbefehl auf alle Dateien an:

%Vor%

3) Speichern Sie alle Dateien und beenden Sie:

%Vor%

Ich denke, du musst dein Suchmuster noch einmal überprüfen, es sieht nicht richtig aus. Ich denke, wo du \_\s* hast, solltest du stattdessen \_s* haben.

Bearbeiten: Sie sollten auch die Optionen /ge für den Befehl :s... verwenden (ich habe diese oben hinzugefügt).

    
too much php 12.07.2010 02:36
quelle
3

Sie können die Aktionen von vi und ex automatisieren, indem Sie das Argument +'command' von der Befehlszeile übergeben, wodurch sie als Textfilter verwendet werden können.

In Ihrer Situation sollte der folgende Befehl funktionieren:

  

find /path/to/dir -name '*.js' | xargs ex +'%s/,\(\_\s*[\]})]\)//g' +'wq!'

    
jabirali 12.07.2010 22:01
quelle
0

Wenn Sie Windows verwenden, können Sie in Notepad ++ einfache Regex für alle geöffneten Dateien ausführen.

Suche nach ,\s*\] und ersetze durch ]

sollte für die Art von Listen funktionieren, die Sie beschreiben.

    
Sylverdrag 12.07.2010 02:33
quelle
0

Sie können eine Kombination aus dem Befehl find und sed

verwenden %Vor%     
ghostdog74 12.07.2010 04:18
quelle

Tags und Links