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

22

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ó vai passar pelo t1_spec.file uma vez e fazer as 4 substituições para cada linha ao invés de passar pelo arquivo 4 vezes?

    
por Michael Durrant 24.10.2013 / 16:45

3 respostas

7

No GNU (por exemplo, na minha máquina Ubuntu), o simples uso de várias linhas é suportado e funciona bem e parece ser bom (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 
    
por 24.10.2013 / 16:45
29

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

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 
    
por 24.10.2013 / 16:57
3

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

O uso do arquivo é particularmente útil se você usar o mesmo conjunto de comandos sed repetidas vezes. Eu costumava ter que lidar com um feed de dados sujo e acabei ao longo do tempo com um arquivo de 88 linhas chamado massage.sed para limpar automaticamente a maioria dos erros comuns que recebi do feed.

    
por 24.10.2013 / 16:49

Tags