У меня есть 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"