sed - comment faire plusieurs substitutions consécutives mais traiter le fichier une seule fois?

31

Si je fais plusieurs substitutions qui doivent être consécutives, par exemple

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 

Y a-t-il une meilleure façon de faire cela qui ne passera par le fichier t1_spec.file qu'une seule fois et effectuera les 4 substitutions pour chaque ligne plutôt que de parcourir le fichier 4 fois?

Michael Durrant
la source

Réponses:

43

En plus d'utiliser des points-virgules, vous pouvez également donner plusieurs expressions à sed en utilisant le -edrapeau:

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 
jofel
la source
14

Dans GNU (par exemple sur ma machine Ubuntu), le simple fait d'utiliser plusieurs lignes est pris en charge et fonctionne bien et semble bon (à mon humble avis) car il évite les lignes super longues, par exemple

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
la source
5

Vous pouvez utiliser des points-virgules pour séparer les différentes sous-postes entre les guillemets simples ou vous pouvez placer toutes ces commandes dans un fichier et spécifier le fichier avec l' -foption sed.

L'utilisation du fichier est particulièrement utile si vous allez utiliser le même ensemble de sedcommandes encore et encore. Auparavant, je devais gérer un flux de données sale et je me suis retrouvé au fil du temps avec un fichier de 88 lignes appelé massage.sedpour effacer automatiquement la plupart des erreurs courantes que j'ai obtenues du flux.

Kurtm
la source