Удалить имя файла из неправильного пути в текстовом файле awk или sed

Удалить имя файла из неправильного пути в текстовом файле awk или sed

У меня есть XML-файл со множеством строк, содержащих что-то вроде этого:

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"

Я хотел бы удалить имена файлов и сохранить все остальное. Вот так:

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"

Имена файлов и папок немного отличаются, но глубина каждого файла одинакова. Так что в основном стираем имя файла после 7-го \

Я составил это регулярное выражение, и оно работает, но имена файлов в других частях XML удаляются:

s/([a-zA-Z0-9_.-]+)\.([a-zA-Z0-9.]{3})$//g

решение1

Способ 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"

Демонстрация и объяснение

решение2

Это можно сделать с помощью GNU sed:

    sed 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file

Работает это следующим образом:

  • Я помню, что между этими словами использовалось \(и \)(это группы захвата).
  • Итак, первая группа захвата запоминает столько, сколько может, пока не встретится \\.*\..*— буквальный обратный слеш (обратите внимание, мне пришлось его экранировать, поэтому их два), за которым следует любое количество символов, а затем буквальная точка (это часть имени файла), за которой следует что угодно до a "(с этого момента мы начинаем вторую группу захвата).
  • Вторая группа захвата запоминает все, что находится после двойной кавычки, которая предшествует пробелу, до конца строки.
  • Затем замените запомненным содержимым первой группы захвата, \1 за которым следует обратная косая черта, запомненное содержимое второй группы захвата и \2.

Убедившись, что все работает так, как вам нужно, просто добавьте , -iчтобы выполнить замену на месте:

    sed -i 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file

Вход:

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"

Выход:

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"

Связанный контент