Wie kann ich einer Textdatei in AppleScript voranstellen?

Ich habe eine .txt-Datei auf meinem Computer gespeichert. Ich möchte, dass Automator ganz oben in der .txt-Datei ein wenig Text hinzufügt . Ich möchte nicht, dass Text in der .txt-Datei überschrieben wird. Ich möchte auch, dass eine neue Zeile für den neuen Text erstellt wird.

Der folgende Befehl fügt den Text der .txt-Datei hinzu, jedoch am Ende der Datei:

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

Kann das Voranstellen einer .txt-Datei in AppleScript durchgeführt werden? Danke schön.


Aktualisieren:

Ich habe einen schädlichen kleinen Fehler in allen aktuellen 4 Antworten auf diese Frage entdeckt.

0A0ALeere Zeilen in einer .txt-Datei, die auf einem Mac erstellt wurde, sollten wie in einem Hex-Editor angezeigt werden . Aber aus irgendeinem Grund konvertieren die Antworten von Matteo, Christian Boyce und user3439894 leere Zeilen in 0D0D. Erzeugt in der Praxis 0D0Dein identisches Ergebnis 0A0A– beide sehen aus wie eine Leerzeile –, aber Mac nimmt es 0D0Dals Wagenrücklauf wahr, während Mac es 0A0Aals Zeilenvorschub wahrnimmt.

Hier ist der Test, den ich durchgeführt habe, um dieses Problem in den Antworten von Matteo und user3439894 zu entdecken (und wenn Sie dasselbe tun, können Sie das Problem reproduzieren):

  1. Erstellen Sie ein neues Dokument in TextEdit. Klicken Sie im Menü „Format“ auf „Nur-Text erstellen“. Speichern Sie die leere Datei als TXT-Datei.

  2. Führen Sie den von Matteo, Christian Boyce oder user3439894 bereitgestellten AppleScript-Code mit dieser TXT-Datei als TargetFilepath aus .

  3. Öffnen Sie die .txt-Datei in TextEdit und fügen Sie der Datei manuell eine Leerzeile hinzu, indem Sie Ihren EnterSchlüssel verwenden.

  4. Öffnen Sie die .txt-Datei in Ihrem Hex-Editor und bestätigen Sie, dass diese neue leere Zeile 0A0A.

  5. Führen Sie den AppleScript-Code erneut aus.

  6. Öffnen Sie die .txt-Datei in Ihrem Hex-Editor. Sie werden nun feststellen, dass die 0A0Ain konvertiert wurde 0D0D.

Hier ist der Test, den ich durchgeführt habe, um dieses Problem in der Antwort von Christian Boyce zu entdecken:

  1. Erstellen Sie ein neues Dokument in TextEdit. Geben Sie "Dies ist ein Satz." ein. Die Datei darf nicht leer sein, wenn Sie den von Christian Boyce bereitgestellten Code fehlerfrei ausführen möchten. Klicken Sie im Menü „Format“ auf „Nur-Text erstellen“. Speichern Sie die Datei als TXT-Datei.

  2. Führen Sie den von Christian Boyce bereitgestellten AppleScript-Code aus. Wenn Sie aufgefordert werden, eine Datei auszuwählen, öffnen Sie diese .txt-Datei.

  3. Öffnen Sie die .txt-Datei in TextEdit und fügen Sie manuell eine Leerzeile zwischen dem neuen "Wassup?" Zeile und die ursprüngliche Zeile "Dies ist ein Satz" mit Ihrem EnterSchlüssel.

  4. Öffnen Sie die .txt-Datei in Ihrem Hex-Editor. Beachten Sie, dass diese neue leere Zeile 0A0D. Es sollte aber sein 0A0A. Während also die Antwort von Christian Boyce nicht alle Instanzen von 0A0Azu ändert 0D0D(so wie es die Antworten von Matteo und user3439894 tun), verwendet sie 0Dstatt 0A"Wassup?" auf einer neuen Zeile.

Ich habe lange gebraucht, um diesen Fehler zu entdecken, da man nie erkennen konnte, dass es ein Problem mit diesen AppleScript-Lösungen gab, es sei denn, man öffnet die .txt-Datei in einem Hex-Editor.

Das Problem mit der Antwort von Mateusz Szlosek ist schwerwiegender; Es ersetzt alle Vorkommen von 0A0Adurch , wodurch sichergestellt wird, dass nirgendwo20 in der TXT-Datei Leerzeilen vorhanden sind (was im Gegensatz zu den anderen Antworten bedeutete, dass ich leicht erkennen konnte, dass es einen Fehler gab, ohne die TXT-Datei in einem Hex-Editor zu öffnen ).

Also öffne ich diese Frage erneut und hoffe jetzt, dass jemand eine Möglichkeit bieten kann, einer TXT-Datei mit AppleScript Text voranzustellen, ohne dabei Zeilenvorschübe in Wagenrückläufe umzuwandeln.

Wenn Sie neugierig sind, warum die Zeilenvorschübe beibehalten werden müssen, liegt das daran, dass ich einen späteren Prozess habe, der in die erste leere Zeile der .txt-Datei schreibt, und dieser Prozess nicht richtig funktioniert, wenn die Zeilenvorschübe durch Wagen ersetzt werden kehrt zurück.

Hier ist sozusagen der Härtetest ... Das Schreiben des repräsentativen Codes in ein bash Skript und das Ausführen in Terminal allein führt zu den erwarteten und gewünschten Ergebnissen, dass nur Zeilenvorschübe und keine Wagenrückläufe vorhanden sind , unabhängig davon, ob Sie mit einer Datei der Länge Null oder einer Datei beginnen, die dies bereits tut hat ASCII-Textinhalt. Die Einführung von Wagenrückläufen bei Verwendung des AppleScript- do shell script Befehls mit denselben bash Befehlen in diesem Anwendungsfall müsste als Fehler angesehen werden , da er nicht das erwartete Verhalten erzeugt. Fortsetzung im nächsten Kommentar...
Daher würde ich diese Methode nicht zum Schreiben in Dateien verwenden und stattdessen die anderen Methoden verwenden, die AppleScript bietet. Ich habe Ihnen bereits ein Beispiel in apple.stackexchange.com/questions/260424/… gezeigt und schlage vor, dass Sie es implementieren, da es keine unerwünschten Wagenrückläufe in das Dokument einführt.
@user3439894 Danke für die Analyse. Ich weiß nicht, wie Sie Ihren Code ändern, der in die erste Instanz einer leeren Zeile schreibt, sodass der Code stattdessen ganz oben in das Dokument schreibt. Die Antwort von Christian Boyce enthält nirgendwo einen do shell scriptBefehl. Können Sie mir sagen, ob meine Antwort in Ordnung ist?
Ich habe meine Antwort (erneut) aktualisiert. :)

Antworten (5)

Aktualisierte Antwort:

Der Code darunter, den ich verwenden würde, um den angebotenen Originalcode zu ersetzen, da es einen Fehler in AppleScript zu geben scheint, wenn der do shell script Befehl auf die ursprünglich dargestellte Weise verwendet wird, der nicht vorhanden ist, wurde der Code auf repräsentative Weise ausgeführt ein bash Skript im Terminal.

Beachten Sie, dass "anytime" open for accessverwendet werden muss, um Fehler abzufangen und zu versuchen, die Datei zu schließen, was dies versucht. Das heißt, es ist nicht unbedingt nur die Fehlerbehandlung, die ich anwenden würde, und alle von mir präsentierten Codierungsantworten dienen als Proof of Concept , und die Pflicht, Code mit angemessener Fehlerbehandlung zu schreiben , liegt bei Ihnen.

Wie codiert erstellt dies die Zieldatei , wenn sie nicht existiert, während der hinzuzufügende Text hinzugefügt wird, und platziert den hinzuzufügenden Text, wenn er existiert, als oberste Zeile der Zieldatei .

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
Ich glaube, ich habe die Ursache des 0D0DProblems gefunden. Bitte gehen Sie wie folgt vor: 1. Erstellen Sie in TextEdit eine leere .txt-Datei im Nur-Text-Format. 2. Führen Sie Ihr Skript mit dieser .txt-Datei als TargetFilepath aus . 3. Öffnen Sie die .txt-Datei in Ihrem Hex-Editor. Sie werden feststellen, dass die letzten vier Hex-Zeichen 0A0A(so weit, so gut) sind. 4. Öffnen Sie die .txt-Datei manuell in TextEdit. Erstellen Sie mit der Eingabetaste eine neue Leerzeile unter dem Beispielsatz. 5. Führen Sie Ihr Skript zum zweiten Mal aus. 6. Öffnen Sie die .txt-Datei in Ihrem Hex-Editor. Sie werden nun feststellen, dass die 0A0Ain eine umgewandelt wurde 0D0D.
Mit anderen Worten, Ihr Code übernimmt alle zuvor geschriebenen Instanzen von 0A0Aund ersetzt sie alle durch 0D0D. Um es klar zu sagen, es ist nicht nur Ihr Code; Die von Matteo und @Christian Boyce bereitgestellten Codes verhalten sich ähnlich. Der Code von Mateusz Szlosek ist sogar noch schlimmer; Beim Ausführen ersetzt es alle Instanzen von 0A0Adurch 20.

Sie könnten es auf diese Weise tun und die Shell-Skripte vermeiden.

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

Im Grunde lesen Sie den Text in der .txt-Datei, Sie setzen "Wassup?" und ein Zeilenumbruch vor dem Text, und dann überschreiben Sie, was in der Datei steht (weil Sie bei Position 0 beginnen).

Sie könnten den aktuellen Inhalt der Datei in eine Variable kopieren, dann kopieren TextToWriteund TargetFilePathden vorherigen Inhalt wieder an anhängen 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

Hier ist ein Beispiel für das AppleScript, das Sie verwenden können:

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

Es verwendet die Formel:echo "prepend\n $(cat input)" > input

Dieser Code stellt den Text erfolgreich voran. Ist es möglich, eine neue Zeile in der .txt-Datei für den neuen Text zu erstellen (wie gewünscht)?
@rubik's sphere, Change set TextToWrite to "NewText"to set TextToWrite to quoted form of "NewText\n"und wenn es kompiliert wird, \nwird das zu einer buchstäblichen neuen Zeile mit dem abschließenden Anführungszeichen buchstäblich in der nächsten Zeile und das \nverschwindet.
@ user3439894 danke für einen Hinweis, ich habe dies zu meiner Antwort hinzugefügt.
@ user3439894 Danke, deine Lösung hat funktioniert. @ MateuszSzlosek Ich habe festgestellt, dass Ihr Code die ursprüngliche Formatierung der .txt-Datei durcheinander bringt. Beispielsweise werden Zeilenumbrüche in der Mitte des Dokuments zufällig entfernt. Versuchen Sie, Ihren Code mit einer TXT-Datei auszuführen, die einige Textabsätze und leere Zeilenumbrüche zwischen den Absätzen enthält. Siehst du, wovon ich spreche?

Nach vielen Versuchen und Irrtümern habe ich, glaube ich, eine Möglichkeit gefunden, einer .txt-Datei Text voranzustellen, ohne dass Wagenrückläufe in die .txt-Datei eingefügt werden.

Meine Lösung basiert auf der von @Christian Boyce bereitgestellten Lösung, mit nur einer kleinen Änderung: Ersetzen returndurch "\n".

Die vollständige Lösung wäre also:

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

Ich habe Tests mit diesem Code durchgeführt und ich habe ihn nicht zum Einfügen in das Dokument gefunden 0Dund er ändert auch keine Instanzen von 0Azu 0D.

@user3439894 Können Sie mir bitte mitteilen, was Sie von dieser Lösung halten? Ist es gut?
Nein, ist es nicht, da es keine oder Eigenschaftsfehlerbehandlung verwendet! Siehe meine aktualisierte Antwort auf apple.stackexchange.com/questions/262687/… insbesondere Teil 4. Jedes Mal, wenn Sie es verwenden, open for accessmuss es codiert werden, um Fehler abzufangen und zu versuchen, die Datei zu schließen. So habe ich es in dem Link codiert, mit dem ich Sie auf die Antwort auf eine andere Ihrer Fragen verweise.