Снимите двойные точки с пути в Баш

Интересно, как можно было бы использовать регулярное выражение, чтобы упростить двойные точки из пути к файлу (путь на самом деле может не существовать)?

Например изменить /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
Другие вопросы по тегам