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 sed
los patrones, por lo que unaliteralSe inserta el retorno de carro. Lo que desea es \\r
una 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 g
modificador (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 i
modificador (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