假设,我有一个目录名称为:“/sites/all/modules”的字符串。我想删除它的最后一个组件,生成:“/sites/all”。我试过,创建一个函数,但它返回:“/sites/all/modules”。
(defun remove-last-dir (dir)
(replace-regexp-in-string "(.*)/.+" "\1" dir))
(print (remove-last-dir "/sites/all/modules"))
ELISP> (directory-file-name (file-name-directory "/sites/all/modules"))
"/sites/all"
file-name-directory
获取给定路径的目录组件。Emacs 认为/
以目录结尾的路径,所以返回值会有一个尾随/
directory-file-name
返回路径的非目录版本(这意味着它会/
从值中去除尾随,如果有的话)。
请注意,如果您的原始参数是(或可能是)/sites/all/modules/
,那么您将希望首先调用directory-file-name
它(否则file-name-directory
只会返回原始值,因为目录路径的“目录组件”本身就是)。
我在 ELisp 中给你写了一些代码,应该可以解决问题:
(defun remove-last-dir (dir)
(let* ((splits (cdr (split-string dir "/")))
(res (mapconcat 'identity (butlast splits) "/")))
(concat "/" res)))
希望这可以帮助!
编写了有效的解决方案:
(defun remove-last-dir (dir)
(string-match "\\(.*\\)/" dir)
(match-string 1 dir))
(print (remove-last-dir "/sites/all/modules"))
印刷:
“/网站/全部”
虽然@phils 的答案对于没有第三方库的 Emacs 来说是正确且惯用的,但如果您经常在 Elisp 中使用文件和文件路径,我建议安装f.el
库,它引入了大量与文件和目录相关的功能。f-dirname
是你需要的:
(f-dirname "path/to/file.ext") ;; => "path/to"
(f-dirname "path/to/directory") ;; => "path/to"
(f-dirname "/") ;; => nil
如果您需要对路径进行更多控制,请查看其他功能。