如何使用Script-Fu解析基本文件名

Don*_*yrd 8 scheme guile gimp script-fu

从gimp.org下载使用Gimp 2.6.6 for MAC OS X(在X11下).

我正在尝试使用Script-Fu自动化无聊的手动过程.我需要解析图像文件名以使用原始文件名上的后缀将各种图层保存为新文件.

我最初的尝试是这样的,但失败了,因为(string-search ...)似乎在2.6下没有(脚本引擎的更改?).

(set! basefilename (substring filename 0 (string-search "." filename))) 
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用此信息使用正则表达式解析基本文件名,但(re-match-nth ...)也无法识别.

(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
    (set! basefilename (re-match-nth orig-name buffer 1))
    )
Run Code Online (Sandbox Code Playgroud)

虽然从向量中拉出值没有错误,但在传入时,结果值不会被视为字符串(string-append ...).

(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
    (set! basefilename (vector-ref buffer 1))
    ) 
Run Code Online (Sandbox Code Playgroud)

所以我想我的问题是,我将如何解析基本文件名?

Fox*_*ox2 8

不是一个正确的解决方案:

>(filename-basename"this.is.a.long.filename.jpg")

"这个"

更好的实施:

(define (morph-filename orig-name new-extension)
 (let* ((buffer (vector "" "" "")))
  (if (re-match "^(.*)[.]([^.]+)$" orig-name buffer)
   (string-append (substring orig-name 0 (car (vector-ref buffer 2))) new-extension)
  )
 )
)
Run Code Online (Sandbox Code Playgroud)


小智 5

上下文

GIMP 2.6.6 Windows Vista SP2

目标

提取原始文件名的基本名称,不带其扩展名.

症状

错误:eval:未绑定变量: re-match-nth

可能的建议

GIMP菜单" 过滤器 ">" Script-Fu ">" 控制台 "

在输入框中,粘贴以下功能的Script-Fu定义,然后按ENTER键:

(define (filename-basename orig-name)
    (car (strbreakup orig-name "."))
    ; Nimmzo 09/09/30: the string split function strbreakup is defined 
    ; in the compatibility file from SIOD to TinyScheme:
    ; C:\Program Files\GIMP\share\gimp\2.0\scripts\script-fu-compat.init
) ; end  filename-basename
Run Code Online (Sandbox Code Playgroud)

要测试该功能,请输入:

(filename-basename "screen.xcf")
Run Code Online (Sandbox Code Playgroud)

Script-Fu控制台回答:

"screen"
Run Code Online (Sandbox Code Playgroud)


phi*_*urn 5

我的版本将文件名(f)拆分成由分隔符分隔的部分(在本例中为"."); 丢掉最后一部分; 并再次将它们与分隔符重新组合

(define (pc-drop-extension f) 
  (unbreakupstr (butlast (strbreakup f ".")) ".")  )
Run Code Online (Sandbox Code Playgroud)

所以

(pc-drop-extension "ab.cd.efi") -> "ab.cd"
Run Code Online (Sandbox Code Playgroud)

(pc-drop-extension "ab/cd.ef/ghi.jkl.mno") -> "ab/cd.ef/ghi.jkl"
Run Code Online (Sandbox Code Playgroud)


Mey*_*yer 5

非常感谢 philcolbourn 指出了一种“简单”的方法来做到这一点。不幸的是,butlast 函数已被弃用: http://www.gimp.org/docs/script-fu-update.html#deprecated

这是 philcolbourn 的版本以及建议的替换:

(define (drop-extension filename)
  (unbreakupstr (reverse (cdr (reverse (strbreakup filename ".")))) ".")
)
Run Code Online (Sandbox Code Playgroud)