Come anteporre al file di testo in AppleScript?

1

Ho un file .txt salvato sul mio computer. Voglio che Automator aggiunga un po 'di testo al molto in alto del file .txt. Non voglio che nessun testo nel file .txt venga sovrascritto. Voglio anche che venga creata una nuova riga per il nuovo testo.

Il seguente comando aggiunge il testo al file .txt, ma alla fine del file:

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

È possibile eseguire il prepending in un file .txt in AppleScript? Grazie.

Aggiornamento:

Ho scoperto un piccolo bug pernicioso in tutte le attuali 4 risposte a questa domanda.

Le righe vuote in un file .txt creato su un Mac dovrebbero apparire come 0A0A in un editor esadecimale. Ma, per qualsiasi motivo, le risposte fornite da Matteo, Christian Boyce e user3439894 convertono le righe vuote in 0D0D . In pratica, 0D0D produce un risultato identico a 0A0A - entrambi assomigliano a una riga vuota - ma Mac percepisce 0D0D come ritorno a capo mentre Mac percepisce 0A0A come avanzamento riga.

Ecco il test che ho fatto per scoprire questo problema nelle risposte fornite da Matteo e dall'utente3439894 (e se fai lo stesso, puoi riprodurre il problema):

  1. Crea un nuovo documento in TextEdit. Fai clic su "Crea testo normale" nel menu Formato. Salva il file vuoto come file .txt.

  2. Esegui il codice AppleScript fornito da Matteo, Christian Boyce o utente3439894 utilizzando questo file .txt come TargetFilepath .

  3. Apri il file .txt in TextEdit e aggiungi manualmente una riga vuota al file utilizzando la chiave Invio .

  4. Apri il file .txt nel tuo editor esadecimale e conferma che questa nuova riga vuota è 0A0A .

  5. Esegui di nuovo il codice AppleScript.

  6. Apri il file .txt nel tuo editor esadecimale. Noterai ora che 0A0A è stato convertito in 0D0D .

Ecco il test che ho fatto per scoprire questo problema nella risposta fornita da Christian Boyce:

  1. Crea un nuovo documento in TextEdit. Scrivi "Questa è una frase". Il file non può essere vuoto se vuoi eseguire il codice fornito da Christian Boyce senza errori. Fai clic su "Crea testo normale" nel menu Formato. Salva il file come file .txt.

  2. Esegui il codice AppleScript fornito da Christian Boyce. Quando ti viene chiesto di scegliere un file, apri questo file .txt.

  3. Apri il file .txt in TextEdit e aggiungi manualmente una riga vuota tra il nuovo "Wassup?" linea e la linea originale "Questa è una frase" usando la tua chiave Invio .

  4. Apri il file .txt nel tuo editor esadecimale. Si noti che questa nuova riga vuota è 0A0D . Dovrebbe essere, tuttavia, 0A0A . Quindi, mentre la risposta fornita da Christian Boyce non cambia tutte le istanze di 0A0A in 0D0D (nel modo in cui le risposte fornite da Matteo e user3439894 fanno), usa 0D invece di 0A quando si mette "Wassup?" su una nuova riga.

Mi ci è voluto molto tempo per scoprire questo problema, poiché non si può mai dire che ci fosse un problema con queste soluzioni AppleScript a meno che non si apra il file .txt in un editor esadecimale.

Il problema con la risposta fornita da Mateusz Szlosek è più grave; sostituisce tutte le istanze di 0A0A con 20 , assicurando così che ci siano no righe vuote ovunque nel file .txt (che, a differenza delle altre risposte, significa che potrei facilmente identificarlo ha avuto un bug senza aprire il file .txt in un editor esadecimale).

Quindi, sto riaprendo questa domanda, sperando ora che qualcuno possa fornire un modo per anteporre il testo a un file .txt utilizzando AppleScript e senza convertire i feed di riga in ritorni a capo nel processo.

Se sei curioso del motivo per cui ho bisogno che i feed di riga siano preservati, è perché ho un processo successivo che scrive sulla prima riga vuota del file .txt e questo processo non funziona correttamente se i feed di riga sono sostituito con ritorni a capo.

    
posta rubik's sphere 08.11.2016 - 19:44
fonte

5 risposte

1

Risposta aggiornata:

Il codice sotto di esso che cosa utilizzerei per sostituire il codice originale offerto in quanto sembra che ci sia un bug in AppleScript quando si utilizza il comando do shell script nel modo originariamente presentato che non è presente, il codice , in modo rappresentativo, viene eseguito in un bash script nel Terminale.

Si noti che ogni volta che viene utilizzato open for access , deve essere codificato per intercettare eventuali errori e provare a chiudere il file, cosa che questo tenta di fare. Detto questo, non è necessariamente solo la gestione degli errori che impiegherò e tutte le risposte di codifica che presento sono fatte come proof of concept e l'onere di scrivere code impiegando un errore ragionevole la consegna è tua da soddisfare.

Come codificato , questo creerà il file di destinazione se non esiste aggiungendo il testo da aggiungere e se esso esiste, posiziona il testo da aggiungere come linea superiore del file di destinazione .

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
    
risposta data 09.11.2016 - 05:41
fonte
1

Potresti farlo in questo modo, evitando gli script della 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

Fondamentalmente hai letto il testo nel file .txt, hai inserito "Wassup?" e un ritorno davanti al testo, e poi scrivi su cosa c'è nel file (perché inizi dalla posizione 0).

    
risposta data 10.11.2016 - 20:03
fonte
1

Potresti copiare il contenuto corrente del file in una variabile, quindi copiare TextToWrite in TargetFilePath e poi aggiungere il contenuto precedente 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
    
risposta data 08.11.2016 - 20:08
fonte
0

Ecco un esempio di AppleScript Puoi usare:

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

Utilizza la formula: echo "prepend\n $(cat input)" > input

    
risposta data 08.11.2016 - 21:40
fonte
0

Dopo un sacco di tentativi ed errori, penso di aver trovato un modo per anteporre il testo a un file .txt senza che i ritorni a capo vengano introdotti nel file .txt.

La mia soluzione si basa sulla soluzione fornita da @Christian Boyce, con una piccola modifica: sostituisci return con "\n" .

Quindi, la soluzione completa sarebbe:

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

Ho eseguito test con questo codice e non l'ho trovato per inserire 0D nel documento e non cambia alcuna istanza di 0A in 0D .

    
risposta data 28.11.2016 - 17:08
fonte

Leggi altre domande sui tag