【发布时间】:2013-04-13 03:01:48
【问题描述】:
我想知道如何使用正则表达式来简化文件路径中的双点(路径可能实际上不存在)?
例如将/my/path/to/.././my/./../../file.txt 更改为/my/file.txt 或将path/./to/../../../file.txt 更改为../file.txt。
是否可以在 bash 的一个命令中执行此操作? (例如使用sed,而不是复杂的python或perl脚本)
编辑:我遇到了this question,但realpath 在我使用的计算机上不可用。
编辑:
从F.J 的解决方案中,我最终构建了以下正则表达式,它适用于更一般的情况(如果路径的某些文件夹名为....,则不起作用):
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'
【问题讨论】:
-
realpath命令不可用,还是realpath()功能不可用?如果你有这个功能,一个合适的程序是:#define _XOPEN_SOURCE 600#include <limits.h>#include <stdio.h>#include <stdlib.h>int main(int argc, char **argv) { int rc = 0; for (int i = 1; i < argc; i++) { char realname[_POSIX_PATH_MAX]; if (realpath(argv[i], realname) != 0) printf("%s\n", realname); else { fprintf(stderr, "Failed to evaluate realpath for %s\n", argv[i]); rc = 1; } } return(rc); } -
只有
realpath命令不可用。但是,我想在可再发行的 bash 脚本中使用它,这使得这个解决方案不是很方便。还是谢谢。