file - Encuentre y reemplace en archivos de texto usando AppleScript
replace find (3)
Modificado de http://discussions.apple.com/message/20542594#20542594 , el controlador a continuación hace lo que quiere. Hice algunos cambios y agregué tus variables. Algunas notas: (1) el ''mi'' antes de la llamada del manejador se asegura de que se vea como el manejador del script y no algo que TextEdit debería interpretar ''internamente'' (porque está en un bloque tell); (2) "caso de consideración" hace que el controlador sea sensible a mayúsculas y minúsculas, lo que supongo que desea; (3) Puede considerar algo como TextWrangler, que tiene soporte AppleScript robusto y rico en funciones, e incluye reemplazo de texto en su diccionario AS, al igual que Smile, un fantástico Editor de scripts (que puede trabajar con texto y formatear archivos muy bien) .
tell application "TextEdit"
set workingWin to open this_document
set this_text to the text of the workingWin
set the text of the workingWin to (my replaceText(this_text, search_string, replacement_text))
close workingWin saving yes
end tell
to replaceText(someText, oldItem, newItem)
(*
replace all occurances of oldItem with newItem
parameters - someText [text]: the text containing the item(s) to change
oldItem [text, list of text]: the item to be replaced
newItem [text]: the item to replace with
returns [text]: the text with the item(s) replaced
*)
considering case
set {tempTID, AppleScript''s text item delimiters} to {AppleScript''s text item delimiters, oldItem}
try
set {itemList, AppleScript''s text item delimiters} to {text items of someText, newItem}
set {someText, AppleScript''s text item delimiters} to {itemList as text, tempTID}
on error errorMessage number errorNumber -- oops
set AppleScript''s text item delimiters to tempTID
error errorMessage number errorNumber -- pass it on
end try
end considering
return someText
end replaceText
Estoy tratando de escribir un AppleScript que se ejecutará a través de un agente de lanzamiento. Lo que la secuencia de comandos debe hacer es editar un archivo plist de preferencias del usuario para que las ubicaciones de guardado predeterminadas sean específicas para ese usuario. Soy consciente de que esto se puede hacer simplemente configurando "~ / documentos" como la ubicación en la lista de la plantilla. Pero Premier Pro, por ejemplo, también necesita escribir archivos de borrador en un disco local. Para simplificar, me gustaría que cada usuario coloque estos en una ubicación basada en su nombre de usuario. Este script solo deberá ejecutarse si el perfil local acaba de crearse a partir de una plantilla al iniciar sesión por primera vez.
Empecé usando un código de muestra que se encuentra en este sitio y simplemente hago una prueba simple a continuación. Esta prueba debería editar un archivo txt y reemplazar una palabra por otra. Este script actualmente no está funcionando. Cuando se prueba, abre test.txt en TextEdit pero no hace nada más. No se muestran errores tampoco.
Gracias de antemano
John.
replaceText("replace this", "replace with this", "/Volumes/USB_Drive/test.txt")
on replaceText(search_string, replacement_text, this_document)
tell application "TextEdit"
open this_document
set AppleScript''s text item delimiters to the search_string
set this_text to the text of the front document as list
set AppleScript''s text item delimiters to the replacement_text
set the text of the front document to (this_text as string)
close this_document saving yes
end tell
end replaceText
Aquí una versión que no necesita editar texto. Leerá el archivo en codificación utf-8, actualizará su contenido y lo almacenará en el archivo como texto codificado en utf-8. La razón por la que utilizo un bloqueo de prueba para escribir el archivo es que habrá un error si otra aplicación tiene el archivo abierto con permiso de lectura al mismo tiempo. El bloque de casos considerado se puede ajustar alrededor del conjunto ti a cada elemento de texto del contenido si desea que la búsqueda y el reemplazo sean sensibles a las mayúsculas y minúsculas. No es necesario que esto esté activo cuando reemplaza la cadena, solo para encontrarla.
set stringToFind to "replace that"
set stringToReplace to "with this"
set theFile to choose file
set theContent to read theFile as «class utf8»
set {oldTID, AppleScript''s text item delimiters} to {AppleScript''s text item delimiters, stringToFind}
set ti to every text item of theContent
set AppleScript''s text item delimiters to stringToReplace
set newContent to ti as string
set AppleScript''s text item delimiters to oldTID
try
set fd to open for access theFile with write permission
set eof of fd to 0
write newContent to fd as «class utf8»
close access fd
on error
close access theFile
end try
Bueno, sí, como señala @dj_bazzie_wazzie, realmente no necesitas un editor de texto para esto, puedes usar el terminal y hacer algo como:
perl -pi -e ''s/old text/new text/g'' /path/to/theFile.plist
que por supuesto puede usar en AppleScript con el poderoso comando de do shell script
:
do shell script "perl -pi -e ''s/" & search_string & "/" & replacement_text & "/g'' " & quoted form of (POSIX path of file_path)
--assuming file_path es una variable con ruta de archivo estilo Mac (separados por dos puntos).