fedithom,
@fedithom@social.saarland avatar

Ich mal wieder, und
Ich will per RegEx einen String in einem Dokument finden, der immer mit ABC anfängt. Danach folgt einen unterschiedliche Menge an (unterschiedlichsten) Zeichen, und zum Schluss immer 2 Zahlen.
Ersetzen will ich danach die beiden Zahlen, ohne dass ABC oder der wilde Kram zwischen den beiden angefasst wird.

Geht sowas? Und wenn ja, wie?
(Und: Hab ich das ausreichend gut erklärt?)

(Update: Mittelteil hat unterschiedliche Zahl an Zeichen)

barubary,

@fedithom Welches Tool bzw. welche Programmiersprache? Beispielhaft Lösungen in Perl:

  • s/(ABC.{42})d{2}/${1}Ersatz/a
  • s/ABC.{42}Kd{2}/Ersatz/a
  • s/(?<=ABC.{42})d{2}/Ersatz/a

(Bitte jeweils 42 und Ersatz durch die korrekte Zeichenzahl bzw. Ersatz-Zeichenfolge ersetzen.)

Und vim:

  • :%s/(ABC.{42})dd/1Ersatz/
  • :%s/ABC.{42}zsdd/Ersatz/
  • :%s/%(ABC.{42})@<=dd/Ersatz/
fedithom,
@fedithom@social.saarland avatar

@barubary

Gibt einiges an Kommentaren. Mein letzter ist Stand der Dinge. Und geht um nen Markdown Text in Atom.

barubary,

@fedithom Hmm, Atom kenne ich nicht. Ich bin mir nicht sicher, ob ich die Problemstellung korrekt verstanden habe, aber hier ist eine Lösung in vim für folgendes Problem: "Finde eine Gruppe von drei Zeilen, von denen die erste mit "INT" anfängt, die zweite mit "|:", und die dritte mit "|" und einer Ziffer. Wenn das Ende der dritten Zeile aus "|" gefolgt von einer Zahl besteht, ersetze diese letzte Zahl durch 14."

:%s/^INT.*n|:.*n|d.*|zsd+$/14/

kojote,

@fedithom /ABC(.+?)\d{2}/

kojote,

@fedithom achso die beiden Zahlen am Schluß in Klammern, dann hast du die in einer Gruppe. Wenn du mir den Text gibst guck ich nachher

kojote,

@fedithom regex.pal mal googlen

fedithom,
@fedithom@social.saarland avatar

@kojote

Danke. So nen Dienst hatte ich schon mal gefunden.

Hier ein Beispielstring:

INT WEI CHA
6 (-2) 15 (+2) 10 (+0)

Da sind dann also auch noch 2 Linebreaks. Hier ist die Zahl am Ende nur einstellig, aber DEN Transfer bekäme ich dann noch hin. ;)
Leider klappt
/INT(.+?)(\d{2})/
nicht. Er scheitert schon am Mittelteil.

dnddeutsch,
@dnddeutsch@pnpde.social avatar

@fedithom @kojote auf der Arbeit würde ich sagen: "Das ist kein Job für Regex, programmier's bitte aus", aber nix ist unmöglich :) Die Schwierigkeit ist, dass dein Identifier und dein Wert ein schwieriges Verhältnis haben. Eine Möglichkeit das abzubilden wäre aber:

/(?:INT|WEI|CHA).?(?:.?|\n){2}|\s*(\d\d?\s+([+-]\d)|){1}(\d\d?)/

mit dem letzten Mulitplier (hier: {1}) steuerst du dann, welchen der drei Werte du matchen willst

fedithom,
@fedithom@social.saarland avatar

@dnddeutsch @kojote

Danke.

Also mit
INT(.+?\n.+?.{48}\n|\w*\s*(.{1,2})|\w*\s*(.{1,2})|\w*\s*(.{1,2})|)(\d{1,2})

hab ich dann Gruppen, und im Replace Feld kann ich dann mit
INT$1(14)
die gewünschte 14 reintackern. DAS ist schon mal n großartiger Fortschritt :)

dnddeutsch,
@dnddeutsch@pnpde.social avatar

@fedithom @kojote Die {48} deutet darauf hin, dass du eine fixe Länge hast. Dann kannst du's dir auch noch einfacher machen:

/INT.{XY}\d+/

und einfach XY anpassen

fedithom,
@fedithom@social.saarland avatar

@dnddeutsch @kojote

Hmm... aber der Punkt . umfasst doch keine linebreaks ...

dnddeutsch,
@dnddeutsch@pnpde.social avatar

@fedithom @kojote wenn du den Modifier s verwendest, umfasst der . auch Linebreaks. Der wird hinten angehangen, also:

s/bla...fasel//s

kojote,

@fedithom @dnddeutsch to be honest, ich hätte es via script zerlegt und dann modifiziert glaub ich

dnddeutsch,
@dnddeutsch@pnpde.social avatar

@kojote @fedithom japp :) Die XSLT Skripte mit denen das Markdown erzeugt wird, sind übrigens unter https://codeberg.org/nesges/SRD-5.1-DE/src/branch/main/build/xsl Das wäre in diesem Fall mein bevorzugter Ansatz, aber ggf. auch Overkill, wenns nur um eine Ersetzung geht

  • All
  • Subscribed
  • Moderated
  • Favorites
  • IT
  • DreamBathrooms
  • ngwrru68w68
  • modclub
  • magazineikmin
  • thenastyranch
  • rosin
  • khanakhh
  • InstantRegret
  • Youngstown
  • slotface
  • Durango
  • kavyap
  • mdbf
  • GTA5RPClips
  • JUstTest
  • tacticalgear
  • normalnudes
  • tester
  • osvaldo12
  • everett
  • cubers
  • ethstaker
  • anitta
  • provamag3
  • Leos
  • cisconetworking
  • megavids
  • lostlight
  • All magazines