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?

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 

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 

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.