Realice varias ediciones con una sola llamada a sed


14

Estoy tratando de usar sed para editar un archivo de configuración. Hay algunas líneas que me gustaría cambiar. Sé que bajo Linux sed -ipermite ediciones in situ, pero requiere que guarde en un archivo de copia de seguridad. Sin embargo, me gustaría evitar tener múltiples archivos de respaldo y hacer todos mis cambios en el lugar a la vez.

¿Hay alguna manera de hacerlo sed -io hay una mejor alternativa?

Respuestas:


20

Puede indicar sedque realice varias operaciones simplemente repitiendo -e(o -fsi su script está en un archivo).

sed -i -e 's/a/b/g' -e 's/b/d/g' filerealiza ambos cambios en el archivo único denominado filein situ. Sin un archivo de respaldo.

sed -ibak -e 's/a/b/g' -e 's/b/d/g' filerealiza ambos cambios en el archivo único denominado filein situ. Con un solo archivo de copia de seguridad llamado filebak.


2
Tenga en cuenta que la secuencia importa. En el comando de ejemplo dado anteriormente, todas las instancias de la letra ase convierten en b, y luego todas las instancias de bse convierten en d. Podrías hacer lo mismo con: sed -i -e 's/a\|b/d/g' fileconvertir todas las instancias de cualquiera ao ben d.
Comodín

4

Otra alternativa es ex, el predecesor de vi. En realidad, es la herramienta POSIX de elección para la edición de archivos con script en el lugar; Es extraordinariamente más flexible sed -iy posiblemente incluso más portátil que Perl. (Si te quedas fuera del mundo de Windows, es indiscutiblemente más portátil que Perl).

Hay una escasez relativa en este intercambio de comandos de ejemplo usando ex, al menos en comparación con la gran cantidad de comandos de ejemplo que usan sed, awky Perl. Sin embargo, yo mismo he profundizado en las especificaciones POSIXex y he estado tocando el tambor desde entonces. He escrito muchas respuestas usando extanto aquí como en el intercambio de pila vi / Vim:

Otras lecturas:


3

Además de utilizar múltiples -eopciones, también puede separar los comandos sed en un solo script sed utilizando líneas nuevas o punto y coma.

Este es el caso si ese script es un trazo en la línea de comando o un archivo de script.

p.ej

sed -e 's/a/b/g ; s/b/d/g' file

Los caracteres de espacio alrededor del ;son opcionales. Los he usado aquí para asegurarme de que el punto y coma se destaca (en general, a excepción de las líneas nuevas que separan comandos, se ignora el espacio en blanco entre los comandos ... pero no olvide que el espacio en blanco dentro de los comandos puede ser y generalmente es significativo).

o:

sed -e 's/a/b/g
        s/b/d/g' file
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.