sed: ¿cómo hacer varias sustituciones consecutivas pero procesar el archivo solo una vez?

31

Si estoy haciendo varias sustituciones que deben ser consecutivas, por ejemplo

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 

¿Hay una mejor manera de hacer esto que solo pasará por el archivo t1_spec.file una vez y hará las 4 sustituciones para cada línea en lugar de pasar por el archivo 4 veces?

Michael Durrant
fuente

Respuestas:

43

Además de usar punto y coma, también puedes dar más de una expresión a sed usando la -ebandera:

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

En GNU (p. Ej., En mi máquina Ubuntu), el simple uso de varias líneas es compatible y funciona bien y se ve bien (en mi humilde opinión) ya que evita las líneas súper largas, p. Ej.

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

Puede usar puntos y comas para separar las diferentes subtensiones entre las comillas simples o puede colocar todos esos comandos en un archivo y especificar el archivo con la -fopción sed.

Usar el archivo es particularmente útil si va a usar el mismo conjunto de sedcomandos una y otra vez. Solía ​​tener que lidiar con una fuente de datos sucia y terminé con el tiempo con un archivo de 88 líneas llamado massage.sedpara eliminar automáticamente la mayoría de los errores comunes que recibí de la fuente.

kurtm
fuente