Eliminar el nombre del archivo de una ruta desordenada en un archivo de texto awk o sed

Eliminar el nombre del archivo de una ruta desordenada en un archivo de texto awk o sed

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"

Demostración y explicación

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 -ipara 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"

información relacionada