Grep y reemplazar

Grep y reemplazar

Tengo un archivo que tiene una RESOURCEpalabra 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 RESOURCEpalabra clave y luego reemplazar la palabra después del signo igual. La RESOURCEpalabra clave no debe modificarse.

¿Alguien podría ayudarme con esto?

aporte:

[email protected]

Producción:

[email protected]

Respuesta1

grepno es útil en este caso ya que no le permite modificar el contenido del archivo.

En cambio, se puede usar sedasí:

fromaddr='[email protected]'
toaddr='[email protected]'

sed '/^RESOURCE=/s/='"$fromaddr"'$/='"$toaddr"'/' file >newfile

dado filecomo

some data
[email protected]
[email protected]
[email protected]
[email protected]
more data

esto crea newfilecomo

some data
[email protected]
[email protected]
[email protected]
[email protected]
more data

La sedexpresió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 =y que la dirección termine al final de la línea.

Respuesta2

El sedcomando 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, le brinda el cambio deseado de:

[email protected]

Si el valor de RESOURCEes diferente en el archivo y desea cambiarlo por algo diferente, entonces:

grep RESOURCE= yourfile

Eso devolverá la línea donde está y mostrará el valor.

Luego puedes usar

sed 's/[email protected]/[email protected]/' yourfile

Para referencia futura, es importante dejar todo esto claro en su pregunta original para que pueda obtener la ayuda que necesita sin todo este galimatías.

Respuesta3

Parece que estás diciendo que deseas reemplazar la cadena que aparece después de =, no importa lo que esPor ejemplo,en los datos de muestra, desea reemplazar [email protected]. Pero estás diciendo que, no importa cuál sea la cadena después de =, quieres reemplazarla [email protected]; aparentemente quieres que esté codificada.

Hay algunas variaciones sobre cómo hacer esto. El más simple es

sed 's/RESOURCE=.*/[email protected]/'

que (como todos los comandos a continuación) utiliza el hecho de que .*significa "coincidir con lo que esté allí". 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 \1significa reemplazar con el primer grupo.

Los comandos anteriores buscarán y reemplazarán RESOURCE= dondequiera que aparezcan en la línea. Así, 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]

sería cambiado 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]

a

[email protected]   [email protected]

eso también se puede hacer. Edite su pregunta para decir exactamente lo que quiere, con explicaciones completas y claras.yejemplos.


Bien, elige uno de los anterioresscomandos. 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 escribas el{y}; están ahí sólo para la demarcación.

información relacionada