¿Cómo se puede hacer una copia previa al archivo de texto en AppleScript?

1

Tengo un archivo .txt guardado en mi computadora. Quiero que Automator agregue un poco de texto a la muy 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 realizar la preparación previa a un archivo .txt en AppleScript? Gracias.

Actualización:

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 0A0A en un editor hexadecimal. Pero, por el motivo que sea, las respuestas proporcionadas por Matteo, Christian Boyce y user3439894 convierten las líneas en blanco en 0D0D . En la práctica, 0D0D produce un resultado idéntico a 0A0A , ambos parecen una línea en blanco, pero Mac percibe 0D0D como un retorno de carro mientras que Mac percibe 0A0A como un salto de línea.

Esta es la prueba que hice para descubrir este problema en las respuestas proporcionadas por Matteo y el usuario 3439894 (y si haces lo mismo, puedes reproducir el problema):

  1. Crea 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 utilizando este archivo .txt como TargetFilepath.

  3. Abra el archivo .txt en TextEdit y agregue manualmente una línea en blanco al archivo con la tecla Enter .

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

  5. Vuelve a ejecutar el código AppleScript.

  6. Abre el archivo .txt en tu editor hexadecimal. Ahora notará que el 0A0A se ha convertido a 0D0D .

Esta es la prueba que hice para descubrir este problema en la respuesta provista por Christian Boyce:

  1. Crea un nuevo documento en TextEdit. Escribe "Esto 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 un archivo .txt.

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

  3. Abra el archivo .txt en TextEdit y agregue manualmente una línea en blanco entre el nuevo "Wassup?" línea y la línea original "Esto es una oración" usando su Ingresar .

  4. Abre el archivo .txt en tu editor hexadecimal. Observe que esta nueva línea en blanco es 0A0D . Debería ser, sin embargo, 0A0A . Entonces, mientras que la respuesta provista por Christian Boyce no cambia todas las instancias de 0A0A a 0D0D (en la forma en que las respuestas proporcionadas por Matteo y user3439894 do), usa 0D en lugar de 0A al poner "Wassup?" en una nueva línea.

Me tomó mucho tiempo descubrir esta falla, ya que uno nunca podría decir que hubo un problema con estas soluciones 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 0A0A con 20 , asegurando así que hay no líneas en blanco en cualquier lugar del archivo .txt (lo que, a diferencia de las otras respuestas, significa que puedo identificarlo fácilmente) tuvo un error sin abrir el archivo .txt en un editor hexadecimal).

Por lo tanto, estoy volviendo a abrir esta pregunta, ahora con la esperanza de que alguien pueda proporcionar una forma de anteponer texto a un archivo .txt utilizando AppleScript y sin convertir los saltos de línea en retornos de carro en el proceso.

Si tiene curiosidad por saber por qué necesito que se conserven las fuentes 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 las fuentes de línea son reemplazado con retornos de carro.

    
pregunta rubik's sphere 08.11.2016 - 19:44

5 respuestas

1

Respuesta actualizada:

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

Tenga en cuenta que en cualquier momento que se use open for access , debe codificarse para capturar cualquier error y tratar de cerrar el archivo, lo que esto intenta hacer. Dicho esto, no es necesariamente solo el manejo de errores que emplearía y toda la respuesta de codificación que presento se hace así como prueba de concepto y la responsabilidad de escribir código con un error razonable la entrega es tuya para cumplir.

Como codificado , esto creará el archivo de destino si no existe mientras se agrega el texto para agregar y si aparece 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
    
respondido por el user3439894 09.11.2016 - 05:41
1

Podrías 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 "Wassup?" y un retorno frente al texto, y luego escribe sobre lo que hay en el archivo (porque comienza en la posición 0).

    
respondido por el Christian Boyce 10.11.2016 - 20:03
1

Puede copiar el contenido actual del archivo a una variable, luego copiar TextToWrite a TargetFilePath y luego agregar el contenido anterior 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
    
respondido por el Matteo 08.11.2016 - 20:08
0

Aquí hay un ejemplo de AppleScript que puedes 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

    
respondido por el Mateusz Szlosek 08.11.2016 - 21:40
0

Después de muchas pruebas y errores, creo que he encontrado una manera de añadir 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 proporcionada por @Christian Boyce, con solo un pequeño cambio: reemplazar return con "\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 realizado pruebas con este código y no lo he encontrado para insertar 0D en el documento y tampoco cambia ninguna instancia de 0A a 0D .

    
respondido por el rubik's sphere 28.11.2016 - 17:08

Lea otras preguntas en las etiquetas