3 votos

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

Tengo un archivo .txt guardado en mi ordenador. Quiero que mi aplicación Automator añada un poco de texto al archivo .txt (el texto será introducido por el usuario). Ya sé cómo añadir texto o añadir texto en AppleScript. Sin embargo, quiero que el texto se inserte en un lugar específico.

Por ejemplo, este es el contenido de mi archivo .txt titulado Mi registro de frutas.txt . Este es el aspecto del archivo .txt antes de el texto se escribe en el archivo:

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

¿Está claro lo que quiero hacer? Quiero que el texto se escriba en la línea inmediatamente superior a la primera línea en blanco que se encuentra en el archivo. Nota: No es necesariamente la segunda línea desde arriba donde quiero que se escriba el texto. Dependiendo del texto que ya se haya escrito en el archivo, el texto podría guardarse en una línea inferior. Por ejemplo:

El lugar donde quiero que se escriba el texto debe ser al menos la segunda línea desde arriba, pero también puede estar tan abajo como la séptima línea desde arriba. Así, la forma más fiable de articular dónde quiero escribir el texto es "en la línea anterior a la primera instancia de una línea en blanco en el documento".

¿Se puede lograr esto en AppleScript?

0 votos

Usted dijo " Así, la forma más fiable de articular dónde quiero escribir el texto es "en la línea anterior a la primera instancia de una línea en blanco en el documento". ", bueno eso no es lo que muestran las imágenes donde tu escribiste " Me comí un coco a las 10 de la mañana. estaba entre dos líneas que no tenían una línea en blanco entre ellas. Entonces, ¿qué es lo que realmente quieres?

0 votos

@user3439894 No, las imágenes son correctas. La segunda imagen es para explicar que la línea a introducir no es siempre la segunda línea, sino la línea indicada por "Esta es la ubicación ".

0 votos

@user3439894 En la segunda imagen, no quiero que el texto se escriba donde dice: "Me comí un coco a las 10 de la mañana". Quiero que el texto se escriba donde dice: "Esta es la ubicación donde quiero que escriba el AppleScript". Puede ser la segunda línea desde arriba, o puede ser la cuarta línea desde arriba. El número de líneas desde la parte superior varía, pero la ubicación siempre estará directamente encima de la primera instancia de una línea en blanco. Lo que escribió grgarside es correcto.

2voto

siva Puntos 23

Aquí hay un shell script:

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

Puedes envolver esto en un 'do shell script' si realmente quieres AppleScript, pero para un Automator script, puedes usar una acción Run Shell script y sólo usar el shell script.


Aquí hay una envoltura de AppleScript para el script, donde la variable TextToWrite y la variable Target_Filepath han sido definidas en otro lugar según tus comentarios:

set addline to "sed -i '' -e ':a' -e 'N' -e '$!ba' -e 's/\\n\\n/\\
" & TextToWrite & "\\
\\
/' \"" & Target_Filepath & "\""
do shell script addline

0 votos

¿Puede mostrar cómo hacer esto en AppleScript? Tengo un código bastante enrevesado, por lo que sería mucho más fácil de implementar si es en AppleScript, en lugar de una acción Run Shell script. Además, ¿qué modificaciones al código son necesarias si el texto a escribir es una variable (por ejemplo, una cadena titulada TextToWrite en lugar del texto real como el que has proporcionado)?

0 votos

He intentado escribir do shell script seguido de todo su código entre comillas dobles, pero me da un error. Así que asumo que convertir tu código a AppleScript no es tan sencillo (a menos que haya cometido un error obvio... lo cual es probable).

0 votos

@rubik'ssphere He añadido un wrapper de AppleScript a mi respuesta y he utilizado el valor de la variable TextToWrite en el script.

1voto

user3439894 Puntos 5883

Si he entendido bien tu pregunta, lo que quieres es escribir un nuevo contenido de texto en el archivo de texto directamente por encima de la primera línea en blanco y si eso es correcto, aquí tienes un ejemplo de una forma de hacerlo.

Tenga en cuenta que a veces el AppleScript do shell script comando puede ser complejo cuando se tiene que escape ciertos casos de cartas especiales , cartas ordinarias y o si son múltiples líneas de comando están involucrados, etc.

Así que en el siguiente ejemplo voy a limitar el do shell script comando a algo tan simple como pueda que no requiera muchos escapes y que a la vez permita un nombre de archivo variable y devolverá el cuenta de bytes hasta el primer línea en blanco en el archivo, ya que creo que este es el punto de inserción que está solicitando para donde se debe escribir el nuevo texto.

A continuación, utilizaré el cuenta de bytes como el offset como punto de referencia donde se escribirá el nuevo texto en el archivo de texto de destino. Esto lo haré leyendo en variables desde el inicio del archivo hasta el offset y la lectura del offset hasta el final del archivo, y luego concatenar los tres variables a uno 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 código :

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 de terminal de "My Fruit Log.txt" antes de ejecutar AppleScript código :

$ 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 de terminal de "My Fruit Log.txt" después de ejecutar AppleScript código :

$ 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 por encima de la primera línea en blanco del archivo.

A continuación vemos el registro de eventos del editor de AppleScript cuando el AppleScrip anterior código se ejecuta:

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

0 votos

Me ha entendido bien. Pregunta: ¿En qué se diferencia su código, funcionalmente, del código de grgarside? Ambos códigos producen el mismo efecto... ¿es un código "superior" al otro en algún sentido?

0 votos

Esfera de @rubik, publiqué mi respuesta hace 2 días cuando parecía que tenías problemas con la respuesta de grgarside, basándome en parte en los comentarios, para que tuvieras una alternativa... aunque hoy ha editado su respuesta. Basta con decir que normalmente hay más de una manera de codificar cualquier cosa y, en general, no significa necesariamente que una manera es superior a la otra si funciona para sus necesidades y usted entiende qué y cómo lo está haciendo y por qué usted podría elegir un método sobre el otro. Me hago eco del comentario de grgarside " Te animo a que eches un vistazo a la documentación de AppleScript ".

0 votos

Cuando ejecuto tu código, obtengo: "La acción "Ejecutar AppleScript" encontró un error. Error de permiso de archivo". Soy el administrador. He hecho clic con el botón derecho del ratón sobre el archivo .txt en el Finder, he hecho clic en "Obtener información" y he puesto los "privilegios" de "mí", "personal" y "todos" en "Lectura y escritura". Todavía me sale el error; no se escribe nada en el archivo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X