AppleScript: ¿Cómo escribir en un archivo de texto en una ubicación específica (señalada por un carácter específico)?

3

Tengo un archivo .txt guardado en mi computadora. Quiero que mi aplicación Automator agregue un poco de texto al archivo .txt (el usuario ingresará el texto). Ya sé cómo adjuntar texto o anteponer texto en AppleScript. Sin embargo, quiero que el texto se inserte en una ubicación específica.

Por ejemplo, este es el contenido de mi archivo .txt titulado My Fruit Log.txt . Así es como se ve el archivo .txt antes , el texto se escribe en el archivo:

Puede ver exactamente dónde quiero que se guarde el texto en el archivo en esta imagen:

¿Lo que quiero hacer está claro? Quiero que el texto se escriba en la línea directamente sobre la primera línea en blanco que se encuentra en el archivo. Nota: No es necesariamente la segunda línea desde la parte superior donde quiero que se escriba el texto. Dependiendo de qué texto ya se haya escrito en el archivo, el texto podría guardarse en una línea inferior. Por ejemplo:

La ubicación donde quiero que se escriba el texto debe ser al menos la segunda línea desde la parte superior, pero también puede estar más abajo que la séptima línea desde la parte superior. Entonces, la forma más confiable de articular donde quiero escribir el texto es "en la línea antes de la primera instancia de una línea en blanco en el documento".

¿Se puede lograr esto en AppleScript?

    
pregunta rubik's sphere 09.11.2016 - 05:03

2 respuestas

2

Aquí hay un script de shell:

sed -i '' -e ':a' -e 'N' -e '$!ba' -e 's/\n\n/\
Write the new line you wish inserted in your file here\
\
/' ~/Desktop/file.txt

Puede envolver esto en un 'do shell script' si realmente desea AppleScript, pero para un script de Automator, puede usar la acción Ejecutar shell script y solo usar el script de shell.

Aquí hay un contenedor de AppleScript para el script, donde la variable TextToWrite y la variable Target_Filepath se han definido en otros lugares según sus comentarios:

set addline to "sed -i '' -e ':a' -e 'N' -e '$!ba' -e 's/\n\n/\
" & TextToWrite & "\
\
/' \"" & Target_Filepath & "\""
do shell script addline
    
respondido por el grg 09.11.2016 - 10:13
1

Si entiendo su pregunta correctamente, debe escribir un nuevo contenido de texto en el archivo de texto que se encuentra arriba de la primera línea en blanco, y si eso es correcto, aquí hay un ejemplo de una forma en que puede hacerse.

Tenga en cuenta que a veces el comando de AppleScript do shell script puede volverse complejo al tener que escapar ciertas instancias de cartas especiales , ordinarias cartas y o si hay varias líneas de comando involucradas, etc.

Por lo tanto, en el siguiente ejemplo, voy a limitar el comando do shell script a algo tan simple como pueda que no requiere mucho escape mientras permite un nombre de archivo variable y devolverá el recuento de bytes hasta la primera línea en blanco en el archivo, ya que creo que este es el punto de inserción que está solicitando donde está el nuevo el texto debe ser escrito.

Luego usaré el recuento de bytes como el punto offset como el punto de referencia donde se escribiría el nuevo texto en el archivo de texto de destino. Lo haré leyendo en variables desde el inicio del archivo hasta el offset y leyendo desde el offset hasta el final del archivo , luego concatene las tres variables a una variable para escribir en el archivo de destino desde el principio del archivo. De este modo, se sobrescribe el contenido antiguo con la combinación de contenido nuevo y antiguo.

AppleScript code :

set filePathName to POSIX path of (path to desktop as string) & "My Fruit Log.txt"

try
    set offsetCount to (do shell script "grep -b -m1 '^$' \"" & filePathName & "\" | cut -f1 -d:")
end try
if offsetCount is equal to "0" or offsetCount is equal to "" then
    display dialog "The contents of the target file does not conform to the necessary requirements for processing and or may contain consecutive 0D Carriage Return Characters, instead of the 0A Line Feed Characters expected by default in macOS." buttons {"OK"} default button 1
    return
end if

set newContent to "I ate a strawberry at 1 am."

try
    set referenceNumber to open for access filePathName with write permission

    set oldContentUpToFirstBlankLine to read referenceNumber from 1 to offsetCount
    set oldContentFromFirstBlankLine to read referenceNumber from offsetCount to eof

    set allContent to oldContentUpToFirstBlankLine & newContent & oldContentFromFirstBlankLine

    write allContent to referenceNumber starting at 0
    close access referenceNumber

on error eStr number eNum
    display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
    try
        close access referenceNumber
    end try
    return
end try

Salida del terminal de "My Fruit Log.txt" antes de ejecutar código AppleScript :

$ cat "$HOME/Desktop/My Fruit Log.txt"
2016_11_09 -

2016_11_08 -
I ate a banana at 8 am.
I ate a kiwi at 11 am.
I ate a mango at 6 pm.

2016_11_07 -
I ate a pear at 6 am.
I ate a tangerine at 4 pm.
I ate a peach at 8 pm.
$ 

Salida del terminal de "My Fruit Log.txt" después de ejecutar el código AppleScript :

$ cat "$HOME/Desktop/My Fruit Log.txt"
2016_11_09 -
I ate a strawberry at 1 am.

2016_11_08 -
I ate a banana at 8 am.
I ate a kiwi at 11 am.
I ate a mango at 6 pm.

2016_11_07 -
I ate a pear at 6 am.
I ate a tangerine at 4 pm.
I ate a peach at 8 pm.
$ 

Como puede ver, esto inserta el nuevo contenido de texto sobre la primera línea en blanco del archivo.

A continuación, vemos el Registro de eventos del Editor de AppleScript cuando se ejecuta el código de AppleScrip :

tell current application
    path to desktop as string
        --> "Macintosh HD:Users:me:Desktop:"
    do shell script "grep -b -m1 '^$' \"/Users/me/Desktop/My Fruit Log.txt\" | cut -f1 -d:"
        --> "13"
    open for access "/Users/me/Desktop/My Fruit Log.txt" with write permission
        --> 172
    read 172 from 1 to "13"
        --> "2016_11_09 -
"
    read 172 from "13" to eof
        --> "

2016_11_08 -
I ate a banana at 8 am.
I ate a kiwi at 11 am.
I ate a mango at 6 pm.

2016_11_07 -
I ate a pear at 6 am.
I ate a tangerine at 4 pm.
I ate a peach at 8 pm.
"
    write "2016_11_09 -
I ate a strawberry at 1 am.

2016_11_08 -
I ate a banana at 8 am.
I ate a kiwi at 11 am.
I ate a mango at 6 pm.

2016_11_07 -
I ate a pear at 6 am.
I ate a tangerine at 4 pm.
I ate a peach at 8 pm.
" to 172 starting at 0
    close access 172
end tell
    
respondido por el user3439894 11.11.2016 - 21:17

Lea otras preguntas en las etiquetas