Tengo un archivo que tiene una RESOURCE
palabra clave. Puede ocurrir en cualquier parte del archivo, como:
[email protected]
Ahora quiero reemplazar [email protected]
con [email protected]
. Tengo que buscar la línea donde puedo encontrar la palabra clave RESOURCE
y luego reemplazar la palabra después del signo igual. La palabra clave RESOURCE
no debe modificarse.
¿Podría alguien ayudarme con esto?
input:
[email protected]
Resultado:
[email protected]
Respuesta
grep
no es útil en este caso ya que no le permite modificar el contenido del archivo.
En su lugar, se puede usar sed
así:
fromaddr="[email protected]" toaddr="[email protected]" sed "/^RESOURCE=/s/=""$fromaddr""$/=""$toaddr""/" file >newfile
Dado file
como
some data [email protected] [email protected] [email protected] [email protected] more data
esto crea newfile
como
some data [email protected] [email protected] [email protected] [email protected] more data
El sed
La expresión seleccionará líneas que comiencen con la cadena RESOURCE
. Para cada una de estas líneas, reemplazará la dirección de correo electrónico, si está presente en la línea. El patrón utilizado para la sustitución asegura que coincidamos con =
y que la dirección termine al final de la línea.
Comentarios
Respuesta
El sed
comando es mejor.
sed -i "s/[email protected]/[email protected]/" yourfile
Lo anterior funciona en mi prueba, pero si quieres probarlo por ti mismo, puedes probar este primero:
sed "s/[email protected]/[email protected]/" yourfile
Eso escribirá los cambios en la salida estándar sin afectar el archivo.
De cualquier manera, da el cambio deseado de:
[email protected]
Si el valor de RESOURCE
es diferente en el archivo y desea cambiarlo en algo diferente, entonces:
grep RESOURCE= yourfile
Eso devolverá la línea donde está y mostrará el valor.
Luego puede usar
sed "s/[email protected]/[email protected]/" yourfile
Para referencia futura, es importante dejar todo esto en claro en su pregunta original para que pueda obtener la ayuda que necesita sin todo este rigamarole.
Comentarios
- No quiero codificar el [email protected], debería ser algo como [email protected]. Quiero reemplazarlo con cualquier otro como [email protected]. Debería ser dinámico
- No ' no entiendo lo que quieres decir. En su pregunta, muestra que desea que la salida sea
[email protected]
, lo que logran ambas respuestas. ¿Qué quieres decir con: " No quiero codificar de forma rígida [email protected] "? y " debería ser dinámico "? - @Lakshminarayana Si desea que realmente realice los cambios en el file luego use
sed i
como di en mi primer comando. Pruébelo primero consed
solo en mi segundo comando para asegurarme de que ' está haciendo lo que usted quiere y luego use elsed -i
en mi primer comando una vez que ' esté seguro de que funciona. - Quiero decir, no quiero codificar ellos. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' su archivo. Quiero pasarlo como parámetros tanto de entrada como de salida.y también quiero buscar esa línea donde tengo RECURSOS y tengo que reemplazarla
- @Lakshminarayana Luego use Kusalananda ' s respuesta y pase las direcciones de correo electrónico a una variable o
grep RESOURCE= file
, obtenga la dirección de correo electrónico que aparece y luego usesed -i
y reemplace[email protected]
y[email protected]
con lo que esté allí y lo que quieras que sea.
Responder
Parece que estás diciendo que quieres reemplazar la cadena que aparece después de =
, sin importar cuál sea – por ejemplo , en los datos de muestra, desea reemplazar [email protected]
. Pero estás diciendo que, sin importar cuál sea la cadena después de =
, quieres reemplazarla con [email protected]
, aparentemente quieres eso codificado.
Hay algunas variaciones sobre cómo hacer esto. El más simple es
sed "s/RESOURCE=.*/[email protected]/"
que (como todos los comandos siguientes) utiliza el hecho de que .*
significa «coincidir con lo que sea esta ahí». Si no desea escribir RESOURCE=
dos veces, puede acortar lo anterior a
sed "s/\(RESOURCE=\).*/\[email protected]/"
donde \(
… \)
marca una parte de la cadena de búsqueda como un grupo (puede tener hasta nueve grupos) y \1
significa reemplazar con el primer grupo.
Los comandos anteriores encontrarán y reemplazarán RESOURCE=
donde sea que aparezca en la línea. Entonces, por ejemplo, la entrada
# Lakshminarayana wants to change all occurrences of "RESOURCE=". [email protected] [email protected] [email protected] FOX RESOURCE=The quick brown fox # Comment: Originally line 2 said [email protected]
se cambiaría a
# Lakshminarayana wants to change all occurrences of "[email protected] [email protected] [email protected] [email protected] FOX [email protected] # Comment: Originally line 2 said [email protected]
Si desea hacer coincidir solo cuando RESOURCE=
aparece al principio de una línea, use ^
:
sed "s/^RESOURCE=.*/[email protected]/"
o
sed "s/^\(RESOURCE=\).*/\[email protected]/"
Si desea reemplazar solo el valor del recurso, y no todo el resto de la línea, por ejemplo,
[email protected] [email protected]
por
[email protected] [email protected]
eso también se puede hacer. Edite su pregunta para decir exactamente lo que quiere, con explicaciones claras y completas y ejemplos.
De acuerdo, elija uno de los s
comandos. Ahora, si desea editar su archivo en su lugar (como ha indicado), haga
sed -i { s command } { yourfile }
Si desea producir un nuevo archivo, haga
sed { s command } { oldfile } > { newfile }
En realidad, no escriba {
y }
; están ahí solo para demarcación.
sed -i
si cree ' está haciendo lo correcto y no ' t redirecciona a un nuevo archivo. Yo ' m generalmente evito usarsed -i
ya que ' no es portátil y ya que si crea un tipo o, puede destruir sus datos originales.