StrReplace - Suche: Text mit Zeilenumbruch? Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

StrReplace - Suche: Text mit Zeilenumbruch?

Post by Stroker-007 » 28 May 2022, 00:12

Hallo, da ist also die

Entensong.txt:

Code: Select all

Alle meine Täubchen
   schwimmen auf dem See

Alle meine Schiffchen
   schwimmen auf dem See

Alle meine Entchen
   schwimmen auf dem See

Alle meine Scheinchen
   schwimmen auf dem See

Text soll nun verändert werden:

Code: Select all

FileRead, Enten, c:\Test\Entensong.txt
if not ErrorLevel
{
    Enten := StrReplace(Enten, "Alle meine Entchen`n   schwimmen auf dem See", "Alle meine Entchen`n   schwimmen in dem Fluß")
    FileDelete, c:\Test\EntensongNEU.txt
    FileAppend, %Enten%, c:\Test\EntensongNEU.txt
    Enten := ""
    run notepad.exe c:\Test\EntensongNEU.txt 
}

Die Textänderung bezieht sich nur auf die 2. Zeile bei den "Entchen".
Weil aber alle 2. Zeilen gleich sind, ist im Suchtext die 1. Zeile zur Identifikation zusätzlich nötig.
Aber da ist diese Zeilenschaltung dazwischen, und dann noch 3 Leerstellen.
Habs mit `n probiert, und auch mit "`n" - läuft aber nicht.

Wie geht das?
Merci schon mal.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: StrReplace - Suche: Text mit Zeilenumbruch?

Post by BoBo » 28 May 2022, 00:21

Datensätze an den Leerzeilen splitten (StrSplit()); anschließend das "Enten-Array-item" befrickeln.
RegExReplace() sollte allerdings auch/einfacher gehen (?) :think:

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: StrReplace - Suche: Text mit Zeilenumbruch?

Post by Stroker-007 » 28 May 2022, 00:39

Danke erstmal, werds heute abend dann durchtesten.
Hatte RegExReplace durchaus schon im Visier, aber da stand nix von wegen Zeilenumbruch zu lesen, und außerdem sei StrReplace schneller.
Außer bei MsgBox nirgends in der Doku was zum Zeilenumbruch zu finden.
Wie soll ich´s also riechen...

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: StrReplace - Suche: Text mit Zeilenumbruch?

Post by BoBo » 28 May 2022, 02:26

"Riechen" heißt hier "Mustererkennung", und die Leerzeilen sind schon ziemlich offensichtliche Separatoren ;)
Leerzeile = Nichts (oftmals gefolgt von einem EOL-character).

Btw…
Alle meine Scheinchen
schwimmen auf dem See
Warum wirfst du Geld in einen See? :o :shock: :shifty: Oder sinds Krankenscheine, Fahrscheine, Passierscheine, Heiligen... ? :wtf:

Welcome, zur 'So könnt's gehen...' -

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: StrReplace - Suche: Text mit Zeilenumbruch?

Post by BoBo » 28 May 2022, 16:05

Dem dürfte irgendwo ziemlich sicher ein RegEx-Einzeiler gegenüberstehen. :think:

Code: Select all

; https://www.loginradius.com/blog/engineering/eol-end-of-line-or-newline-characters/

#SingleInstance, Force

MsgBox % empty("")         ;  leerzeile (zeichenanzahl=0)
MsgBox % empty("`n")       ; "leerzeile" mit abschließendem Zeilenumbruch (zeichenanzahl=1, LF)
MsgBox % empty("`r")       ; "leerzeile" mit abschließendem Zeilenumbruch (zeichenanzahl=1, CR)
MsgBox % empty("`r`n")     ; "leerzeile" mit abschließendem Zeilenumbruch (zeichenanzahl=2, CRLF)
MsgBox % empty("a`n")      ;  textzeile  mit abschließendem Zeilenumbruch (zeichenanzahl>1)
MsgBox % empty("a`nb`nc")  ;  mehrzeiler mit zeilenumbrüchen

empty(zeile) {
   Return     StrLen(zeile)=0 
            ? 1 
            : StrLen(zeile)=1 && (zeile=Chr(10))
            ||StrLen(zeile)=1 && (zeile=Chr(13))
            ||StrLen(zeile)=2 && (zeile=Chr(13) . Chr(10)) 
            ? 1 
            : 0
   }

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: StrReplace - Suche: Text mit Zeilenumbruch?

Post by Stroker-007 » 28 May 2022, 17:40

Datensätze an den Leerzeilen splitten (StrSplit()); anschließend das "Enten-Array-item" befrickeln.
Ist mir zu hoch, versteh ich nicht.

RegExReplace() sollte allerdings auch/einfacher gehen
Ein verwertbarer Hoffnungschimmer, siehe unten.

"Riechen" heißt hier "Mustererkennung"
"Mustererkennung" riecht nicht, für mich.
Und wieso Mustererkennung? Dafür fehlt es mir an Basiswissen.

und die Leerzeilen sind schon ziemlich offensichtliche Separatoren ;)
Leerzeile = Nichts (oftmals gefolgt von einem EOL-character).
Leerzeilen? Die gesuchte Problemlösung heißt "Text mit Zeilenumbruch".
Was hat das mit Leerzeilen zu tun? Aber vermutlich fehlt es mir auch hierbei um Basiswissen.

Scheinchen
schwimmen auf dem See
Das war nur zur erbaulichen Erheiterung of the audience gedacht.


Der "Befehl" Replace

Nachdem ich längere Zeit mit der erfolglosen Suche nach dem Befehl "Replace" in Dokus und Web zugebracht hatte, dämmerte mir in der zufällig gefundenen Abteilung "Funktionen" und mit dem Vergleich des Bobo-Beispiels, daß es sich hierbei um eine PKM handeln könnte.

Für diejenigen, die eine PKM nicht kennen: Persönlich Kreierte Maßnahme.
(Auch ich kann einfach so Dinge aus der Luft zaubern...)
Will heißen: Nicht mal bei "Funktionen" wird solches zweifelsfrei erklärt.
Man muß auch da noch einiges dazu-riechen.
Leider ist mein Geruchssinn nur durchschnittlich ausgprägt.
Gerne auch unterdurchschnittlich, wenn´s denn hilft.


BoBo-Skript: Der haystack und die Entchen

Obwohl darin mein Problem als gelöst demonstriert wird, kann ich damit nichts anfangen.
Ist mir viel zu hoch, verstehe trotz der Zeile-für-Zeile-Kommentare nur Bahnhof.
Aber unterhaltsam ist diese successive MsgBox-Performance allemal. Sehr fein, vielen Dank.


BoBo-Skript, die Zweite

Noch mehr MsgBoxen, emptys, Leerzeilen und Zeilenumbrüche.
Meine Verwirrung könnte nicht größer sein...


Zurück zum Thema

RegExReplace als Alternative, vielen Dank für den Tip!
Meine Versuche dazu:

Code: Select all

FileRead, Enten, c:\Test\Entensong.txt
if not ErrorLevel
{
    Enten := RegExReplace(Enten, "m)^Alle meine Entchen   schwimmen auf dem See$", "m)^Alle meine Entchen`r`n   schwimmen in dem Fluß$") ;  funktioniert nicht
;   Enten := RegExReplace(Enten, "Schiffchen", "Boote") ;  vereinfachte Form, ohne Umbruch: funktioniert
    FileDelete, c:\Test\EntensongNEU.txt
    FileAppend, %Enten%, c:\Test\EntensongNEU.txt
    Enten := ""
    run notepad.exe c:\Test\EntensongNEU.txt 
}

Habe mit mehreren Varianten mit diesen Schaltern experimentiert, kein Erfolg.
Nirgends ist für mich ein ähnliches Beispiel zu finden, wie diese Schalter --- m) ^ $ --- in diesem Fall zu handhaben sind.
Kann mir bitte jemand die Ersetzen-Zeile innerhalb meines Skriptkontextes so formulieren, wie sie funktioniert?

Danke!

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: StrReplace - Suche: Text mit Zeilenumbruch?  Topic is solved

Post by Stroker-007 » 28 May 2022, 23:20

Hab die Lösung nun selbst gefunden.
Es ist sehr einfach, es fehlte nur das `r

Code: Select all

FileRead, Enten, c:\Test\Entensong.txt
if not ErrorLevel
{
    Enten := StrReplace(Enten, "Alle meine Entchen`r`n   schwimmen auf dem See", "Alle meine Entchen`r`n   schwimmen in dem Fluß")
    FileDelete, c:\Test\EntensongNEU.txt
    FileAppend, %Enten%, c:\Test\EntensongNEU.txt
    Enten := ""
    run notepad.exe c:\Test\EntensongNEU.txt 
}

Es ist nicht einmal m) am Anfang der Nadel nötig.
Und es funktioniert gleichermaßen mit StrReplace als auch mit RegExReplace.
Bedanke mich für die wertvollen Anregungen.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: StrReplace - Suche: Text mit Zeilenumbruch?

Post by BoBo » 29 May 2022, 03:01

Und wieso Mustererkennung? Dafür fehlt es mir an Basiswissen.
... was ich mal bezweifle :arrow: [click], denn schließlich machst Du anschließend mit RegExReplace(): https://www.dev-insider.de/regex-zum-suchen-und-ersetzen-nutzen-a-840347/ ... genau das - yep, Mustererkennung ;)

Stroker-007
Posts: 135
Joined: 28 Jan 2021, 17:09
Location: Germany

Re: StrReplace - Suche: Text mit Zeilenumbruch?

Post by Stroker-007 » 29 May 2022, 09:00

Datensätze an den Leerzeilen splitten (StrSplit()); anschließend das "Enten-Array-item" befrickeln.
"Riechen" heißt hier "Mustererkennung", und die Leerzeilen sind schon ziemlich offensichtliche Separatoren ;)
Leerzeile = Nichts (oftmals gefolgt von einem EOL-character).

In dieser qualitativ hochwertigen Lösungsumgebung spielt die Mustererkennung sicherlich eine tragende Rolle.
Mir fehlt es an Basiswissen, das zu verstehen oder zu erkennen.
In mir bekanntem Terrain (Datenbank coden) hatte/habe ich permanennt mit Mustererkennung zu tun.

Bei diesem Thema hier geht´s aber nicht mal um eine Text-Mustersuche, sondern um banale Direkt-Textsuche, mit einem ebenso banalen Cartridge-Return dazwischen.
Und wenn man möchte, dann kann die Lösung ebenso banal sein, auch wenn bisweilen Bretter vor meinem Hirn liegen.

Zum Verständnis stell ich mal noch das eigentliche Skript ein, wofür ich das gebraucht habe.
Um die Frage überschaubarer und das Problem testfähig (in erster Linie für mich) zu machen,
hab ich analog dazu das mit den Enten kreiert, da die originale Default.cfg ziemlich umfangreich ist.
Läuft jetzt wie ein geölter Blitz:

Code: Select all

; StrokeIt-Umschalter für Sauna, für 2 verschiedene Stroke-Aktionen zu [Right-Left] in der Default.cfg

process, close, strokeit.exe 
sleep 500

FileRead, DefaultCFG, c:\Y\StrokeIt\Actions\Default.cfg
process, exist, Desktop Clock Plus-7.exe
if errorLevel 
goto Sauna

DefaultCFG := StrReplace(DefaultCFG, "6 Suchen [Right-Left] {`r`n   gesture = Leer", "6 Suchen [Right-Left] {`r`n   gesture = Right-Left")
DefaultCFG := StrReplace(DefaultCFG, "Fenster next Mon [Right-Left] {`r`n   gesture = Right-Left", "Fenster next Mon [Right-Left] {`r`n   gesture = Leer")
goto finish

Sauna:
DefaultCFG := StrReplace(DefaultCFG, "6 Suchen [Right-Left] {`r`n   gesture = Right-Left", "6 Suchen [Right-Left] {`r`n   gesture = Leer")
DefaultCFG := StrReplace(DefaultCFG, "Fenster next Mon [Right-Left] {`r`n   gesture = Leer", "Fenster next Mon [Right-Left] {`r`n   gesture = Right-Left")

finish:
FileDelete, c:\Y\StrokeIt\Actions\Default.cfg
FileAppend, %DefaultCFG%, c:\Y\StrokeIt\Actions\Default.cfg
DefaultCFG := ""
sleep 1000
run c:\Y\StrokeIt\StrokeIt.exe
run c:\Y\AHK-Skript\ClearSystray.ahk

Post Reply

Return to “Ich brauche Hilfe”