sed - como fazer várias substituições consecutivas, mas processar o arquivo apenas uma vez?

31

Se eu estiver fazendo várias substituições que precisam ser consecutivas, por exemplo,

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 

Existe uma maneira melhor de fazer isso que só passará pelo t1_spec.file uma vez e fará as 4 substituições para cada linha em vez de passar pelo arquivo 4 vezes?

Michael Durrant
fonte

Respostas:

43

Além de usar ponto e vírgula, você também pode dar mais de uma expressão para sed usando o -esinalizador:

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

No GNU (por exemplo, na minha máquina Ubuntu), o simples uso de várias linhas é suportado e funciona bem e fica bem (imho), pois evita linhas super longas, por exemplo

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
fonte
5

Você pode usar ponto-e-vírgula para separar as diferentes subestações entre aspas simples ou colocar todos esses comandos em um arquivo e especificar o arquivo com a -fopção para sed.

O uso do arquivo é particularmente útil se você deseja usar o mesmo conjunto de sedcomandos repetidamente. Eu costumava lidar com um feed de dados sujo e acabava com o tempo com um arquivo de 88 linhas chamado massage.sedpara limpar automaticamente a maioria dos erros comuns que recebi do feed.

Kurtm
fonte