use sed para reemplazar parte de una cadena

use sed para reemplazar parte de una cadena

Estoy pensando en reemplazar ciertas cadenas en un archivo; entonces estoy usando sed.

Me gustaría reemplazar la cadena, mientras que sed lee la cadena y agrega el texto en el medio de la cadena.

Ejemplo:

string in myfile : user=blabla
string that I want to obtain: user=bob

así que ejecuto sed de esta manera, para que busque la cadena "usuario=" y la reemplace con "usuario=bob".

sed -i 's/user=*/user=bob/' myfile

lo que obtengo es

user=bobblabla

Básicamente, sed piensa que quiero reemplazar solo esa parte, mientras que quiero reemplazar toda la cadena con la nueva cadena. Pensé que * le diría a sed que considerara cualquier cosa que venga después, pero no funciona.

Como no sé cuál será "blabla", no puedo ponerlo en el comando sed. ¿Cómo le digo a sed que busque una cadena que comience con "usuario=" y reemplace toda la cadena con la nueva?

Respuesta1

Parece que estás confundiendo patrones de shell con expresiones regulares. En un patrón de shell, *significa cero o más de cualquier carácter. En una expresión regular, que es lo que sedse espera en sus patrones, *significa cero o más del átomo anterior. En su ejemplo, ese átomo es el =. Entonces, sedse busca userseguido de cero o más =y se reemplaza la cadena coincidente con user=bob. El patrón que deseas es user=.*, el cual es user=seguido por cualquier carácter ( .) cero o más veces, haciendo tu sedcomando:

sed -i 's/user=.*/user=bob/' myfile

Respuesta2

Como dijo GaryJohn, te equivocaste con la expresión regular. (* -> .*)

Pero iría un poco más allá, mientras estás en eso... No sé cómo es realmente tu archivo, pero solo para practicar buscaría hacer que tu operación de búsqueda/reemplazo sea un poco más segura.

Supongamos que desea ejecutarlo en un archivo como este:

user=john
superuser=jimmy      # don't want to change this line!
user=L33t_us3rn4m3   # that should work too, and these comments should remain intact as well, btw
# in the line below, I want to change user=hello to user=bob
# but in the comments, "user=hello" should remain intact
user=hello

Con su sintaxis sed actual, esto saldría bastante mal. Para hacerlo un poco más específico, puedes intentar:

sed -i 's/^user=[A-Za-z0-9_]*/user=bob/g' /tmp/myfile

Esta voluntad:

  • solo se activa cuando la línea realmente comienza con "usuario" (el ^)
  • solo cambie "usuario=" en la medida en que contenga 0 o más letras, dígitos o guiones bajos
  • dejar todo lo que hay detrás del nombre de usuario (es decir, los comentarios en mi ejemplo) intacto

Esto no es de ninguna manera algo súper seguro que funcionará siempre y en todos los lugares donde desee cambiar el nombre de los usuarios. Obviamente, eso depende de cómo esté configurado su archivo de configuración y de lo que esperaría encontrar. Pero mi respuesta está destinada a dar un poco de "reflexión", porque dado un (número de) archivos de configuración lo suficientemente grandes como para esperar que tantos nombres de usuarios no quieran hacer esto manualmente, reemplazando ciegamente "usuario=.* "Parece posiblemente peligroso. Quizás quieras dedicar algo de tiempo a pulir este tipo de operaciones :)

Buena suerte.

información relacionada