使用瘸子2.6.6从gimp.org下载MAC OS X(X11下)。

我试图用自动化脚本富一个镗手动过程。我需要解析图像文件名来保存关闭各种层如使用对原始文件名的后缀的新文件。

我最初的尝试是这样进行的,但失败了,因为(string-search ...)似乎并不为2.6(更改脚本引擎?)获得。

(set! basefilename (substring filename 0 (string-search "." filename))) 

然后我试图使用此信息使用正则表达式来解析出基本文件名但(re-match-nth ...)也不会被识别。

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

和同时拉动值出来的向量RAN的无误差,所得到的值不被视为当它被送入(string-append ...)一个字符串。

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

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

有帮助吗?

解决方案

上下文

GIMP 2.6.6的Windows Vista SP2

目标

提取原来的文件名的基本名称而不其扩展名。

症状

  

错误:EVAL:未结合的变量:   重新匹配-第n

可能的建议

GIMP菜单 “过滤器”> “的脚本福”> “的控制台

在输入框,粘贴的功能下面的脚本富定义 然后打输入键:

(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

要测试的功能,输入:

(filename-basename "screen.xcf")

脚本富控制台答案:

"screen"

其他提示

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

  

>(文件名-基名 “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)
  )
 )
)

我的版本分割的文件名(F)到由分离器(在这种情况下“”)分隔部件;滴最后一部分;并重新组合它们与分离器再次

(define (pc-drop-extension f) 
  (unbreakupstr (butlast (strbreakup f ".")) ".")  )

所以

(pc-drop-extension "ab.cd.efi") -> "ab.cd"

(pc-drop-extension "ab/cd.ef/ghi.jkl.mno") -> "ab/cd.ef/ghi.jkl"

非常感谢philcolbourn您指出一个“简单”的方式来做到这一点。 不幸的是,butlast功能被弃用: http://www.gimp.org/docs/script-fu-update html的#弃用

下面是philcolbourn的版本与所述建议的替换:

(define (drop-extension filename)
  (unbreakupstr (reverse (cdr (reverse (strbreakup filename ".")))) ".")
)

正如在GIMP 2.8“辫形图像-GET-URI”必须被用来获得一个JPG文件的文件名,但辫形图像-GET-URI提供的完整路径,我用这个函数来仅仅提取的照片(没有后缀 “.JPG”)的名称:

(让*(点击       (uriname(汽车(GIMP图像-GET-URI IMAGE)))点击       (基名(轿厢(反向(strbreakup(轿厢(strbreakup uriname “”)) “/”)))),点击       ...点击       )结果 ...点击 )

对于那些寻找一个真正的字符串替换功能,这里是我的脚本富

使用写了一个函数
(define (string-replace strIn strReplace strReplaceWith)
    (let*
        (
            (curIndex 0)
            (replaceLen (string-length strReplace))
            (replaceWithLen (string-length strReplaceWith))
            (inLen (string-length strIn))
            (result strIn)
        )
        ;loop through the main string searching for the substring
        (while (<= (+ curIndex replaceLen) inLen)
            ;check to see if the substring is a match
            (if (substring-equal? strReplace result curIndex (+ curIndex replaceLen))
                (begin
                    ;create the result string
                    (set! result (string-append (substring result 0 curIndex) strReplaceWith (substring result (+ curIndex replaceLen) inLen)))
                    ;now set the current index to the end of the replacement. it will get incremented below so take 1 away so we don't miss anything
                    (set! curIndex (-(+ curIndex replaceWithLen) 1))
                    ;set new length for inLen so we can accurately grab what we need
                    (set! inLen (string-length result))
                )
            )
            (set! curIndex (+ curIndex 1))
        )
       (string-append result "")
    )
)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top