Tengo un archivo xml con muchas líneas que contienen algo como esto:
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\Drawing965.DWG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\File1.PNG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\Other.000" Module="0"
Me gustaría eliminar los nombres de los archivos y conservar todo lo demás. Al igual que:
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"
Los nombres de los archivos y las carpetas difieren bastante, pero la profundidad de cada archivo es la misma. Básicamente, borre el nombre del archivo después del séptimo \
Hackeé esta expresión regular y funciona, pero se están eliminando los nombres de archivos en otras partes del xml:
s/([a-zA-Z0-9_.-]+)\.([a-zA-Z0-9.]{3})$//g
Respuesta1
Una forma de Perl:
perl -pne 's/^.+\\\K[^"]+//' file
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"
Respuesta2
Esto lo hará con GNU sed:
sed 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file
La forma en que funciona es la siguiente:
- Recuerdo las cosas entre el uso anterior
\(
y\)
(estos son grupos de captura). - Entonces, el primer grupo de captura recuerda todo lo que puede hasta que llega
\\.*\..*
, que es una barra invertida literal (tenga en cuenta que tuve que escapar de ella, por lo que hay dos) seguida de cualquier cantidad de caracteres y luego un punto literal (esto es parte del nombre del archivo), seguido de cualquier valor hasta"
(que es donde comenzamos el segundo grupo de captura). - El segundo grupo de captura recuerda todo después de una comilla doble que precede a un espacio hasta el final de la línea.
- Luego reemplácelo con el contenido recordado del primer grupo de captura
\1
seguido de una barra invertida literal seguida del contenido recordado del segundo grupo de captura y\2
.
Una vez que haya confirmado que hace lo que desea, simplemente agregue -i
para realizar la sustitución en el lugar:
sed -i 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file
Aporte:
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\Drawing965.DWG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\File1.PNG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\Other.000" Module="0"
Producción:
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"