Emacs删除字符串中的最后一个目录

时间:2013-02-23 19:55:05

标签: regex elisp

假设我有一个目录名称为“/ 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 个答案:

答案 0 :(得分: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将返回原始值,因为目录路径的“目录组件”本身)。

答案 1 :(得分:2)

我在ELisp中给你写了一些应该做的诀窍:

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

希望这有帮助!

答案 2 :(得分:1)

写出有效的解决方案:

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

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

打印:

“/位点/所有”

答案 3 :(得分:1)

虽然@phils's answer对于没有第三方库的Emacs是正确且惯用的,但如果您经常使用Elisp中的文件和文件路径,我建议安装f.el库,这会引入大量文件和目录相关的功能。 f-dirname就是您所需要的:

(f-dirname "path/to/file.ext") ;; => "path/to"
(f-dirname "path/to/directory") ;; => "path/to"
(f-dirname "/") ;; => nil

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

相关问题