Tres cosas...
Primero, evita usar name
como una variable ya que ya tiene significado en varios lugares. Puedes ver que su color es diferente a las otras variables (en mi sistema es de color morado, como una propiedad, en lugar de verde como una variable. Intenta algo como fName
en su lugar.
Segundo, la causa clave de tu problema es words
.
Si ejecutas la siguiente línea en un script separado, verás el problema:
words of "111.1.1 - 檔案(cookie)"
--> {"111.1.1", "檔", "案", "cookie"}
Para el sistema, cada uno de los dos caracteres chinos se considera individualmente una palabra. Además, los ()
se consideran signos de puntuación y no forman parte de la palabra cookie
. Debo notar que dependiendo de tu entorno de sistema (el mío está configurado en inglés de EE. UU.), podrías obtener un resultado diferente.
El resultado es que cuando solicitas las primeras tres palabras de la cadena, no obtienes cookie
.
¿Tu cadena de entrada siempre tendrá la misma estructura?
por ejemplo 'cadena de fecha' ' - ' 'caracteres chinos' 'palabra entre paréntesis'
Actualizaciones:
Intenta esto. En lugar de usar grep
y words (que pueden no aplicarse dependiendo de la cadena de entrada), uso sed
y párrafos. El comando sed
divide la cadena en párrafos basados en cada grupo capturado. Cada una de las tres variables puede asignarse entonces al grupo apropiado.
Actualización: Revisa el script para manejar adecuadamente tanto inputString como currentFolderPath, según comentarios/imagen
set inputString to quoted form of "113.1.29 - 一段文字(123)"
set currentFolderPath to "/Users/cookie/Desktop/113.10.10 - helloworld測試(test)"
set regexCmd to "sed -Ee 's@^.*\\/([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]].*$)@\\1@' -e 's@([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+)[[:blank:]]-[[:blank:]](.*)(\\(.*\\))@\\1\\
\\2\\
\\3@ ' "
-- filename, person
set {inputDateString, inputFileName, inputPerson} to extractData(inputString, regexCmd)
display alert "Fecha: " & inputDateString # funcionando como se espera
display alert "Nombre archivo: " & inputFileName # valor incorrecto
display alert "Persona: " & inputPerson # valor incorrecto
log "inputString: " & inputString & linefeed & "inputDateString: " & inputDateString & linefeed & "inputFileName: " & inputFileName & linefeed & "inputPerson: " & inputPerson & linefeed
-- ruta de carpeta
set currentFolderPath to quoted form of currentFolderPath
set {folderDateString, folderFileName, folderPerson} to extractData(currentFolderPath, regexCmd)
log "currentFolderPath: " & currentFolderPath & linefeed & "folderDateString: " & folderDateString & linefeed & "folderFileName: " & folderFileName & linefeed & "folderPerson: " & folderPerson
-- manejador
on extractData(inputString, regexCmd)
try
set capturedData to {}
set regexResults to do shell script "printf " & inputString & " | " & regexCmd
set {rocDateString, filename, person} to paragraphs of regexResults
set capturedData to {rocDateString, filename, person}
on error
set capturedData to {"", "", ""}
end try
return capturedData
end extractData
Por cierto, aquí está la versión del comando en shell, para que también puedas probarlo en la terminal.
% printf "113.1.29 - 一段文字(123)" | sed -E -e 's@^.*/([[:digit:]]+\.[[:digit:]]+\.[[:digit:]].*$)@\1@' -e 's@([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)[[:blank:]]-[[:blank:]](.*)(\(.*\))@\1\
\2\
\3@ '