AppleScript: come scrivere su un file di testo in una posizione specifica (segnalata da un carattere specifico)?

3

Ho un file .txt salvato sul mio computer. Voglio che la mia applicazione Automator aggiunga un po 'di testo al file .txt (il testo verrà inserito dall'utente). So già come aggiungere testo o inserire il testo in AppleScript. Tuttavia, voglio che il testo sia inserito in una posizione specifica.

Ad esempio, questo è il contenuto del mio file .txt intitolato My Fruit Log.txt . Ecco come appare il file .txt prima il testo viene scritto nel file:

Puoi vedere esattamente dove voglio che il testo sia salvato nel file in questa immagine:

È ciò che voglio chiarire? Voglio che il testo sia scritto sulla linea direttamente sopra la prima riga vuota trovata nel file. Nota: non è necessariamente la seconda riga dall'alto in cui voglio che il testo sia scritto. A seconda del testo già scritto sul file, il testo potrebbe essere salvato su una riga inferiore. Ad esempio:

La posizione in cui voglio che il testo sia scritto deve essere almeno la seconda riga dall'alto, ma potrebbe anche essere più in basso della settima riga dall'alto. Quindi, il modo più affidabile per articolare dove voglio scrivere il testo è "sulla riga prima della prima istanza di una riga vuota nel documento."

Questo può essere realizzato in AppleScript?

    
posta rubik's sphere 09.11.2016 - 05:03
fonte

2 risposte

2

Ecco uno script di 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

Puoi racchiuderlo in uno "script di shell" se vuoi veramente AppleScript, ma per uno script di Automator, puoi usare l'azione Esegui script di shell e usare solo lo script di shell.

Ecco un wrapper AppleScript per lo script, in cui la variabile TextToWrite e la variabile Target_Filepath sono state definite altrove per i tuoi commenti:

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

Se comprendo correttamente la tua domanda, tu che cosa scrivere del nuovo contenuto di testo nel file di testo direttamente sopra la prima riga vuota e se questo è corretto, ecco un esempio di come può essere fatto.

Si noti che a volte il comando AppleScript do shell script può diventare complesso quando si deve sfuggire determinate istanze di carte speciali , ordinarie charters e / o se sono presenti più righe di comando , ecc.

Quindi nel seguente esempio ho intenzione di limitare il do shell script comando a qualcosa il più semplice possibile che non richieda molta escaping pur consentendo un nomefile variabile e restituirà il numero di byte fino alla prima riga vuota nel file, poiché credo che questo sia il punto di inserimento che stai richiedendo per dove il nuovo il testo deve essere scritto.

Utilizzerò quindi il conteggio dei byte come punto offset come punto di riferimento in cui scrivere il nuovo testo nel file di testo di destinazione. Lo farò leggendo in variables dall'inizio del file su offset e leggendo dallo offset alla fine del file , quindi concatena le tre variabili a una variabile per scrivere nel file di destinazione dall'inizio del file. Sovrascrivendo così il vecchio contenuto con la combinazione di nuovi e vecchi contenuti.

Codice AppleScript :

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

Uscita terminale di "My Fruit Log.txt" prima di eseguire il codice di 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.
$ 

Uscita terminale di "My Fruit Log.txt" dopo aver eseguito il codice di 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.
$ 

Quindi, come puoi vedere, questo inserisce il nuovo contenuto di testo sopra la prima riga vuota nel file.

Di seguito vediamo il registro eventi dell'AppleScript Editor quando viene eseguito il codice AppleScrip sopra riportato

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
    
risposta data 11.11.2016 - 21:17
fonte

Leggi altre domande sui tag