3

假设,我有一个目录名称为:“/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"))
4

4 回答 4

7
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只会返回原始值,因为目录路径的“目录组件”本身就是)。

于 2013-02-23T21:49:23.310 回答
2

我在 ELisp 中给你写了一些代码,应该可以解决问题:

(defun remove-last-dir (dir)
  (let* ((splits (cdr (split-string dir "/")))
         (res (mapconcat 'identity (butlast splits) "/")))
     (concat "/" res)))

希望这可以帮助!

于 2013-02-23T20:05:41.827 回答
1

编写了有效的解决方案:

(defun remove-last-dir (dir)
      (string-match "\\(.*\\)/" dir)
      (match-string 1 dir))

(print (remove-last-dir "/sites/all/modules"))

印刷:

“/网站/全部”

于 2013-02-23T20:27:37.767 回答
1

虽然@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

如果您需要对路径进行更多控制,请查看其他功能。

于 2014-04-22T11:26:39.713 回答