Platzhalter in Textdatei durch fortlaufende Nummerierung ersetzen

M

MIkeo-l-e-

Aktives Mitglied
Thread Starter
Dabei seit
26.12.2007
Beiträge
181
Reaktionspunkte
20
Hallo MacUser,

wie kann ich eine in einer Textdatei mehrfach vorkommende Zeichenkombination durch eine fortlaufende Nummerierung ersetzen?
Beispiel:
Aus:
asdf x asdf asdf
x asdf
asdf x

wird:
asdf 5 asdf asdf
6 asdf
asdf 7

Ich schließe mal aus, dass das mit textedit funktioniert. Auf anderen Seiten wird empfohlen, es mit grep zu versuchen. Doch eine Anleitung kann ich nirgends finden. Oder ist sowas machbar mit Automator oder AppleScript? Ich bräuchte vor Allem einen Anstoß in die richtige Richtung.

Vielen Dank für euere Hilfe!
 
Hier mal ein Beispiel mit AppleScript:

Code:
set theText to "abc bca cba abc cab abc
abc aab abc" -- Beispieltext
set theDelimiter to "abc" -- Zeichenkombination

set n to 1
set theResult to ""
set AppleScript's text item delimiters to theDelimiter
set textList to text items of theText
set AppleScript's text item delimiters to ""

if (count textList) > 1 then
repeat with n from 1 to (count textList) - 1
set theResult to theResult & (item n of textList) & n
end repeat
set theResult to theResult & last item of textList
end if
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: MIkeo-l-e-
Super, vielen Dank! Ich versuche es gerade im Einzelnen nachzuvollziehen.
Wenn ich nun z. B. den Algorithmus nicht auf theText sondern auf das gerade geöffnete textedit Dokument anwenden möchte, sieht mein Code folgendermaßen aus:
Code:
tell application "TextEdit"
    tell text of document of front window
        set theDelimiter to "{1}" -- Zeichenkombination
       
        set n to 1
        set theResult to ""
        set AppleScript's text item delimiters to theDelimiter
        set textList to text items of text
        set AppleScript's text item delimiters to ""
       
        repeat with n from 1 to (count textList) - 1
            set theResult to theResult & (item n of textList) & n
        end repeat
       
        return theResult
    end tell
end tell
Wie man sehen kann, versuche ich hier den Text des geöffneten Dokuments mit text zu adressieren (entspricht theText in deinem Beispiel). Jedoch erhalte ich dann folgende Fehlermeldung:
Code:
error "„every text item of text“ kann nicht gelesen werden." number -1728 from every text item of text

Das gleiche Problem habe ich auch, wenn ich aus dem Script in Automator einen Dienst erstellen will. Wie soll ich den markierten Text adressieren?

Viele Grüße!
 
Mit TextEdit sollte es so funktionieren:

Code:
tell application "TextEdit"
    set theText to text of front document
    set theDelimiter to "abc" -- Zeichenkombination
  
     set theResult to ""
    set AppleScript's text item delimiters to theDelimiter
    set textList to text items of theText
    set AppleScript's text item delimiters to ""
  
    if (count textList) > 1 then
        repeat with n from 1 to (count textList) - 1
            set theResult to theResult & (item n of textList) & n
        end repeat
        set theResult to theResult & last item of textList
        set text of front document to theResult
    end if
end tell
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: MIkeo-l-e-
awk -v RS=x '{$0=n$0;ORS=RT}++n' file.txt
 
  • Gefällt mir
Reaktionen: MIkeo-l-e-
Nochmal Danke für deine Mühe. Ich denke ich habe das Script fast komplett verstanden, habe aber trotzdem noch ein paar Fragen:

Code:
tell application "TextEdit"
    set theText to text of front document
    set theDelimiter to "abc" -- Zeichenkombination
Der Dokumententext wird in der Variable theText gespeichert. OK.
Die gesuchte Zeichenkombination wird in der Variable theDelimiter gespeichert. OK.

Code:
    set n to 1
    set theResult to ""
Eine Variable n gleich 1 wird erstellt. OK.
Die Variable theResult wird erstellt. Ihr ist jedoch noch kein Wert zugeteilt?

Code:
    set AppleScript's text item delimiters to theDelimiter
Teilt den Text an der Stelle abc. Ein Text
xxxabcyyy
zzzabc§§§
würde also in die drei Abschnitte xxx, yyyzzz und §§§ aufgeteilt?

Code:
    set textList to text items of theText
Eine Variable textList wird erstellt. Diese Variable ist ein Vektor mit allen Elementen des Textes, in diesem Beispiel (xxx, yyyzzz, §§§).

Code:
    set AppleScript's text item delimiters to ""
Der Text wird nun wieder geteilt. Welcher Text, es sind doch nur noch Bruchstücke vorhanden. An welcher Stelle wird nun geteilt, hinter jedem Zeichen?

Code:
    if (count textList) > 1 then
Wenn der Vektor textList mehr als 1 Element enthält, geschieht folgendes:

Code:
        repeat with n from 1 to (count textList) - 1
            set theResult to theResult & (item n of textList) & n
        end repeat
1. Zeile: Die Schleife wird für jedes n zwischen n=1 und (count textList) -1 einmal durchlaufen.
2. Zeile: Die Variable theResult wird mit jedem Iterationsschritt verändert:
1. Durchlauf: theResult = "" & xxx & 1 = xxx1
2. Durchlauf: theResult = xxx1 & yyyzzz & 2 = xxx1yyyzzz2
.
.
. OK

Code:
        set theResult to theResult & last item of textList
Die Variable theResult wird hier noch einmal um den letzten Textbaustein erweitert. OK.

Code:
        set text of front document to theResult
    end if
end tell
Die Schleife wurde so lange durchlaufen bis nur noch ein Textbaustein übrig war.
 
Das könnte am Zeilentrenner liegen. Kommt deine Datei von Windows?
 
Wenn der Platzhalter aus mehr als einem Zeichen bestünde, dann ja.
BSD ist leider auch hier restriktiver, aber ich hab's gerne kompakt. :p
 
Zurück
Oben Unten