Tengo un archivo con los siguientes contenidos:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
y necesito hacer un script que cambie el "nombre" en la primera línea a "algo", la "contraseña" en la segunda línea a "algo más" y el "nombre" en la tercera línea a "algo diferente". No puedo confiar en el orden de estos en el archivo, por lo que no puedo simplemente reemplazar la primera aparición de "nombre" con "algo" y la segunda aparición de "nombre" con "algo diferente". De hecho, necesito hacer una búsqueda de las cadenas circundantes para asegurarme de encontrar y reemplazar lo correcto.
Hasta ahora he intentado este comando para encontrar y reemplazar la primera aparición de "nombre":
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
Sin embargo, no funciona, así que creo que algunos de estos personajes podrían necesitar escapar, etc.
Idealmente, me encantaría poder usar expresiones regulares para que coincida con las dos ocurrencias de "nombre de usuario" y reemplazar solo el "nombre". Algo como esto pero con sed
:
<username>.+?(name).+?</username>
y reemplace el contenido entre paréntesis con "algo".
es posible?
fuente
Respuestas:
Esto es, creo, lo que estás buscando.
Explicación:
\1
,\2
, Etc. en la segunda parte son referencias al grupo i-ésimo capturado en la primera parte (la numeración comienza con 1)-E
habilita expresiones regulares extendidas (necesarias para+
y agrupación).fuente
(original name) + "-E"
.\(
y en\)
lugar de(
y)
.El
/username/
antes de las
le indica a sed que sólo el trabajo en las líneas que contienen la cadena 'nombre de usuario'.fuente
Si
sed
no es un requisito difícil, mejor use una herramienta dedicada en su lugar.Si su archivo es XML válido (no solo esas 3 etiquetas de aspecto XML), puede usar XMLStarlet :
Lo anterior también funcionará en situaciones que serían difíciles de resolver con expresiones regulares:
Breve demostración de lo anterior:
fuente
Debe citar
\[.*^$/
en la parte de la expresión regular dels
comando y\&/
en la parte de reemplazo, además de líneas nuevas. La expresión regular es una expresión regular básica , y además necesita citar el delimitador para els
comando.Puede elegir un delimitador diferente para evitar tener que citar
/
. Tendrás que citar ese carácter en su lugar, pero generalmente el punto de cambiar el delimitador es elegir uno que no aparezca en el texto para reemplazar o el texto de reemplazo.Puede usar grupos para evitar repetir algunas partes en el texto de reemplazo, y acomodar la variación en estas partes.
fuente
Simplemente puede usar direcciones como en el número que precede a "s", que indica el número de línea.
Además, el número al final indica
sed
que reemplace la segunda coincidencia en lugar de reemplazar la primera coincidencia.fuente
Para reemplazar la palabra "nombre" con la palabra "algo", use:
Eso reemplazará todas las apariciones de la palabra especificada.
Hasta ahora, todo se envía a la salida estándar, puede usar:
para guardar los cambios en otro archivo.
fuente
para reemplazar el valor en un archivo de propiedades
fuente