sed - wie mache ich mehrere Ersetzungen hintereinander und verarbeite die Datei nur einmal?

31

Wenn ich mehrere Substitutionen mache, die aufeinander folgen müssen, z

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/' t1_spec.rb
sed -i '/expect(browser.*\.should/s/\.should/).should/' t1_spec.rb
sed -i 's/\.should/\.to/' t1_spec.rb 
sed -i 's/==/eq/' t1_spec.rb 

Gibt es eine bessere Möglichkeit, dies zu tun, indem die Datei t1_spec.file nur einmal durchlaufen wird und die vier Ersetzungen für jede Zeile vorgenommen werden, anstatt die Datei viermal zu durchlaufen?

Michael Durrant
quelle

Antworten:

43

Neben der Verwendung von Semikolons können Sie sed auch mehr als einen Ausdruck geben, indem Sie das -eFlag verwenden:

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 
Jofel
quelle
14

In GNU (z. B. auf meinem Ubuntu-Rechner) wird die einfache Verwendung mehrerer Zeilen unterstützt und funktioniert gut und sieht gut aus (imho), da superlange Zeilen vermieden werden, z

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/
        /expect(browser.*\.should/s/\.should/).should/
        s/\.should/\.to/
        s/==/eq/' t1_spec.rb 
Michael Durrant
quelle
4

Sie können Semikolons verwenden, um die verschiedenen Substitutionen zwischen den einzelnen Anführungszeichen zu trennen, oder Sie können alle diese Befehle in eine Datei einfügen und die Datei mit der -fOption to angeben sed.

Die Verwendung der Datei ist besonders nützlich, wenn Sie immer wieder dieselben sedBefehle verwenden. Früher musste ich mich mit einem unsauberen Daten-Feed auseinandersetzen und landete im Laufe der Zeit in einer Datei mit 88 Zeilen, die aufgerufen wurde massage.sed, um die meisten Fehler, die ich aus dem Feed bekam, automatisch zu beseitigen.

Kurtm
quelle