¿Cómo anteponer un archivo de texto en AppleScript?

Tengo un archivo .txt guardado en mi computadora. Quiero que Automator agregue un poco de texto en la parte superior del archivo .txt. No quiero que se sobrescriba ningún texto en el archivo .txt. También quiero que se cree una nueva línea para el nuevo texto.

El siguiente comando agrega el texto al archivo .txt, pero al final del archivo:

set TextToWrite to "This sentence should be the first line of the .txt file."
set TargetFilepath to "/Users/Me/Desktop/Documents/My File.txt"
do shell script "echo " & quoted form of TextToWrite & " >> " & quoted form of TargetFilepath

¿Se puede anteponer un archivo .txt en AppleScript? Gracias.


Actualizar:

Descubrí un pequeño error pernicioso en todas las 4 respuestas actuales a esta pregunta.

Las líneas en blanco en un archivo .txt creado en una Mac deberían aparecer como 0A0Aen un editor hexadecimal. Pero, por alguna razón, las respuestas proporcionadas por Matteo, Christian Boyce y el usuario 3439894 convierten las líneas en blanco en 0D0D. En la práctica, 0D0Dproduce un resultado idéntico a 0A0A(ambos se ven como una línea en blanco), pero Mac lo percibe 0D0Dcomo un retorno de carro mientras que Mac lo percibe 0A0Acomo un salto de línea.

Aquí está la prueba que hice para descubrir este problema en las respuestas proporcionadas por Matteo y el usuario 3439894 (y si hace lo mismo, puede reproducir el problema):

  1. Crear un nuevo documento en TextEdit. Haga clic en "Hacer texto sin formato" en el menú Formato. Guarde el archivo vacío como un archivo .txt.

  2. Ejecute el código AppleScript proporcionado por Matteo, Christian Boyce o user3439894 usando este archivo .txt como TargetFilepath .

  3. Abra el archivo .txt en TextEdit y agregue manualmente una línea en blanco al archivo usando su Enterclave.

  4. Abra el archivo .txt en su editor hexadecimal y confirme que esta nueva línea en blanco es 0A0A.

  5. Vuelva a ejecutar el código AppleScript.

  6. Abra el archivo .txt en su editor hexadecimal. Ahora notará que se 0A0Aha convertido a 0D0D.

Aquí está la prueba que hice para descubrir este problema en la respuesta proporcionada por Christian Boyce:

  1. Crear un nuevo documento en TextEdit. Escribe "Esta es una oración". El archivo no puede estar vacío si desea ejecutar el código proporcionado por Christian Boyce sin error. Haga clic en "Hacer texto sin formato" en el menú Formato. Guarde el archivo como archivo .txt.

  2. Ejecute el código AppleScript que proporcionó Christian Boyce. Cuando se le pida que elija un archivo, abra este archivo .txt.

  3. Abra el archivo .txt en TextEdit y agregue manualmente una línea en blanco entre el nuevo "¿Qué pasa?" línea y la línea original "Esta es una oración" usando su Enterclave.

  4. Abra el archivo .txt en su editor hexadecimal. Observe que esta nueva línea en blanco es 0A0D. Debería ser, sin embargo, 0A0A. Entonces, si bien la respuesta proporcionada por Christian Boyce no cambia todas las instancias de 0A0Ato 0D0D(de la forma en que lo hacen las respuestas proporcionadas por Matteo y el usuario 3439894), sí usa 0Den lugar de 0Aal poner "¿Qué tal?" en una nueva línea.

Me tomó mucho tiempo descubrir esta falla, ya que uno nunca podría decir que había un problema con estas soluciones de AppleScript a menos que uno abra el archivo .txt en un editor hexadecimal.

El problema con la respuesta proporcionada por Mateusz Szlosek es más grave; reemplaza todas las instancias de 0A0Awith , lo que garantiza que no20 haya líneas en blanco en ninguna parte del archivo .txt (lo que, a diferencia de las otras respuestas, significaba que podía identificar fácilmente que tenía un error sin abrir el archivo .txt en un editor hexadecimal) ).

Entonces, estoy reabriendo esta pregunta, ahora espero que alguien pueda proporcionar una forma de anteponer texto a un archivo .txt usando AppleScript, y sin convertir saltos de línea en retornos de carro en el proceso.

Si tiene curiosidad por qué necesito que se conserven los saltos de línea, es porque tengo un proceso posterior que escribe en la primera línea en blanco del archivo .txt, y este proceso no funciona correctamente si los saltos de línea se reemplazan con carro devoluciones.

Aquí está la prueba de fuego, por así decirlo... Escribir el código representativo en un bash script y ejecutarlo solo en Terminal produce los resultados esperados y deseados de tener solo saltos de línea , no retornos de carro , ya sea que comience con un archivo de longitud cero o un archivo que ya tiene contenido de texto ASCII. La introducción de retornos de carro al usar do shell script el comando de AppleScript con los mismos bash comandos en este caso de uso debería considerarse un error , debido a que no está produciendo el comportamiento esperado. Continúa en el siguiente comentario...
Por lo tanto, no usaría esta metodología para escribir en archivos y, en su lugar, usaría los otros métodos que ofrece AppleScript. Ya le mostré un ejemplo en apple.stackexchange.com/questions/260424/… y sugiero que lo implemente ya que no introduce retornos de carro no deseados en el documento.
@ user3439894 Gracias por el análisis. No sé cómo modificar su código que escribe en la primera instancia de una línea en blanco para que el código escriba en la parte superior del documento. La respuesta proporcionada por Christian Boyce no tiene un do shell scriptcomando en ninguna parte. ¿ Puedes decirme si mi respuesta está bien para usar?
He actualizado mi respuesta (nuevamente). :)

Respuestas (5)

Respuesta actualizada:

El código debajo de él lo usaría para reemplazar el código original ofrecido, ya que parece haber un error en AppleScript cuando se usa el do shell script comando de la manera presentada originalmente que no está presente, el código , de manera representativa, se ejecuta en un bash script en Terminal.

Tenga en cuenta que en cualquier momento open for accessse utiliza, debe codificarse para atrapar cualquier error e intentar cerrar el archivo, lo que intenta hacer. Dicho esto, no es necesariamente solo el manejo de errores que emplearía y todas las respuestas de codificación que presento se realizan como prueba de concepto y la responsabilidad de escribir el código que emplea un manejo de errores razonable es suya.

Tal como está codificado , esto creará el archivo de destino si no existe mientras se agrega el texto para agregarlo y, si existe, coloca el texto para agregar como la línea superior del archivo de destino .

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

--    # set theTextToWrite to "This text will be written at the top of the file." & "\n"    
set theTextToWrite to "This text will be written at the top of the file." & "\n"
set theOriginalText to ""
try
    set theOriginalText to (read targetFilePathname) as string
end try
--    # set theTextToWrite to theTextToWrite & "\n" & theOriginalText
set theTextToWrite to theTextToWrite & "\n" & theOriginalText
try
    set referenceNumber to open for access targetFilePathname with write permission
    write theTextToWrite 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
Creo que pude haber encontrado la causa raíz del 0D0Dproblema. Haga lo siguiente: 1. Cree un archivo .txt de texto sin formato vacío en TextEdit. 2. Ejecute su script usando este archivo .txt como TargetFilepath . 3. Abra el archivo .txt en su editor hexadecimal. Notarás que los últimos cuatro caracteres hexadecimales son 0A0A(hasta ahora todo bien). 4. Abra manualmente el archivo .txt en TextEdit. Cree una nueva línea en blanco debajo de la oración de muestra con la tecla Intro. 5. Ejecute su script por segunda vez. 6. Abra el archivo .txt en su editor hexadecimal. Ahora notará que se 0A0Aha convertido a un archivo 0D0D.
En otras palabras, su código toma cualquier instancia escrita previamente 0A0Ay las reemplaza todas con 0D0D. Para ser claros, no es solo su código; los códigos que proporcionaron Matteo y @Christian Boyce se comportan de manera similar. El código proporcionado por Mateusz Szlosek es aún peor; al ejecutarse, reemplaza todas las instancias de 0A0Acon 20.

Podría hacerlo de esta manera, evitando los scripts de shell.

set the_file to choose file
set the_content to read of the_file

set the_new_stuff to "Wassup?" & return & the_content
set the_file_path to the_file as string
set open_for_writing to open for access file the_file_path with write permission
write the_new_stuff to open_for_writing starting at 0
close access open_for_writing

Básicamente lees el texto en el archivo .txt, pones "¿Qué pasa?" y un retorno delante del texto, y luego escribes sobre lo que hay en el archivo (porque comienzas en la posición 0).

Puede copiar el contenido actual del archivo en una variable, luego copiar TextToWritey TargetFilePathluego agregar el contenido anterior nuevamente a TargetFilePath.

set x to (do shell script "cat " & quoted form of TargetFilePath)

do shell script "echo " & quoted form of TextToWrite & " > " & quoted form of TargetFilePath

do shell script "echo " & quoted form of x & " >> " & quoted form of TargetFilePath

Aquí hay un ejemplo del AppleScript que puede usar:

set TargetFilepath to "$HOME/Desktop/file.txt"
set TextToWrite to quoted form of "NewText\n"
do shell script "echo " & TextToWrite & "$(cat " & TargetFilepath & ") > " & TargetFilepath

Utiliza la fórmula:echo "prepend\n $(cat input)" > input

Este código antepone con éxito el texto. ¿Es posible crear una nueva línea en el archivo .txt para el nuevo texto (según lo solicitado)?
La esfera de @rubik, cambia set TextToWrite to "NewText"a set TextToWrite to quoted form of "NewText\n"y cuando compila se \nconvertirá en una nueva línea literal con la cita de cierre literalmente en la siguiente línea y \ndesaparecerá.
@ user3439894 gracias por una pista, agregué esto a mi respuesta.
@ user3439894 Gracias, su solución funcionó. @ MateuszSzlosek Descubrí que su código interfiere con el formato original del archivo .txt. Por ejemplo, elimina aleatoriamente los saltos de línea en el medio del documento. Intente ejecutar su código con un archivo .txt que tenga algunos párrafos de texto y saltos de línea vacíos entre los párrafos. ¿Ves de lo que estoy hablando?

Después de muchas pruebas y errores, creo que he encontrado una forma de anteponer texto a un archivo .txt sin que se introduzcan retornos de carro en el archivo .txt.

Mi solución se basa en la solución provista por @Christian Boyce, con solo un pequeño cambio: reemplazar returncon "\n".

Entonces, la solución completa sería:

set the_file to choose file
set the_content to read of the_file

set the_new_stuff to "Wassup?" & "\n" & the_content
set the_file_path to the_file as string
set open_for_writing to open for access file the_file_path with write permission
write the_new_stuff to open_for_writing starting at 0
close access open_for_writing

He hecho pruebas con este código y no lo he encontrado para insertarlo 0Den el documento y tampoco cambia ninguna instancia de 0Aa 0D.

@ user3439894 ¿Puede decirme cómo se siente con respecto a esta solución? ¿Esta bien?
¡No, no lo es, ya que no emplea ningún manejo de errores de propiedad! Vea mi respuesta actualizada a apple.stackexchange.com/questions/262687/… especialmente la Parte 4. Cada vez que lo use, open for accessdebe codificarse para atrapar cualquier error e intentar cerrar el archivo. Así es como lo codifiqué en el enlace que le señalo la respuesta de otra de sus preguntas.