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

  • No quiero codificar el [email protected], debería ser algo como nasir37 @ yahoo .com. Quiero reemplazarlo con cualquier otro como [email protected]. Debe ser dinámico – Lakshminarayana acaba de editar
  • @Lakshminarayana Ver respuesta actualizada.
  • No quiero escríbalo en un archivo nuevo de nuevo … porque el archivo también consta de otros datos. Como se muestra a continuación.
  • @Lakshminarayana Luego ejecute con sed -i si cree ' está haciendo lo correcto y no ' t redirecciona a un nuevo archivo. Yo ' m generalmente evito usar sed -i ya que ' no es portátil y ya que si crea un tipo o, puede destruir sus datos originales.
  • Lo entiendo. ¿Cómo puedo buscar la línea que tiene la palabra RECURSO? Tengo que buscarlo en un archivo que tiene otros datos y tengo que reemplazarlo. Además, tengo que pasar el nombre del archivo como parámetro

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 con sed solo en mi segundo comando para asegurarme de que ' está haciendo lo que usted quiere y luego use el sed -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 use sed -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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *