Cómo usar sed para reemplazar una línea completa por otra con caracteres

Cómo usar sed para reemplazar una línea completa por otra con caracteres

El archivo contiene lo siguiente en la línea 19

send -- "[email protected]\r"

Quiero cambiar el correo electrónico así que pensé y se me ocurrió esto.

sed -i.bak '19s/.*/send -- "[email protected]\r"/' ./a

cambia la línea 19 pero lo que obtengo es

"end -- "[email protected]

¿Qué está pasando mal y cómo solucionarlo?

Respuesta1

La barra invertida es el carácter de escape en sedlos patrones, por lo que unaliteralSe inserta el retorno de carro. Lo que desea es \\runa barra invertida seguida de un literal r.

Respuesta2

En lugar de buscar y reemplazar, puedes cambiar la línea 19:

sed '19c\send -- "[email protected]\\r"'

Respuesta3

Estás haciendo que esto sea más difícil de lo necesario: simplemente cambia la dirección de correo electrónico, no toda la línea. Demostrar:

$ echo 'send -- "[email protected]\r"'  | sed 's/old@example\.com/[email protected]/'
send -- "[email protected]\r"

Por cierto, opcionalmente puede usar el gmodificador (global) al final del comando s///si el patrón de búsqueda puede ocurrir más de una vez en una línea, y/o el imodificador (ignorar mayúsculas y minúsculas) si desea una búsqueda que no distinga entre mayúsculas y minúsculas, por ejemplo, para usa ambos: .s/old@example\.com/[email protected]/ig

De todos modos, tu comando se vería así:

sed -i.bak '19s/old@example\.com/[email protected]/' ./a

Si no sabía el número de línea exacto que desea cambiar, especifique una expresión regular como dirección de línea en lugar de un número de línea:

sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/[email protected]/' ./a

Es aún más fácil cambiar TODAS las apariciones de[correo electrónico protegido]en el archivo, simplemente no se moleste en especificar una dirección y la sustitución se realizará en cada línea del archivo.

sed -i.bak 's/old@example\.com/[email protected]/' ./a

información relacionada