Снимите двойные точки с пути в Баш
Интересно, как можно было бы использовать регулярное выражение, чтобы упростить двойные точки из пути к файлу (путь на самом деле может не существовать)?
Например изменить /my/path/to/.././my/./../../file.txt
в /my/file.txt
или же path/./to/../../../file.txt
в ../file.txt
,
Возможно ли сделать это одной командой в bash? (с помощью sed
например, не сложный скрипт на python или perl)
редактировать: я сталкивался с этим вопросом, но realpath
недоступно на компьютере, которым я пользуюсь.
редактирование: из решения Andrew Clark я закончил создание следующего регулярного выражения, которое работает в более общих случаях (не работает, если какая-то папка пути названа ....
):
sed -e 's|/\./|/|g' -e ':a' -e 's|\.\./\.\./|../..../|g' -e 's|^[^/]*/\.\.\/||' -e 't a' -e 's|/[^/]*/\.\.\/|/|' -e 't a' -e 's|\.\.\.\./|../|g' -e 't a'
1 ответ
Решение
Попробуйте следующее:
sed -e 's|/\./|/|g' -e ':a' -e 's|/[^/]*/\.\./|/|' -e 't a'
Пример:
$ echo '/my/path/to/.././my/./../../file.txt' |
sed -e 's|/\./|/|g' -e ':a' -e 's|/[^/]*/\.\./|/|' -e 't a'
/my/file.txt
Вот описание подхода:
read line
replace all '/\./' in line with '/'
while there is a match of '/[^/]*/\.\./' {
replace first occurrence of '/[^/]*/\.\./' in line with '/'
}
output line