• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[Perl] ersetze bestimmten Teil

Grobian

New member
Hallo,

ich habe eine Frage zum Replacement:
Ich habe einen Textstring "IND[text][text]"

den ich in "\index{text}{text}" umwandeln möchte.
Dafür habe ich ein Script, welches sehr gut funktioniert:

Code:
use strict;
use warnings;

$^I = '.bak'; # create a backup copy 

while (<>) {
   
   s/IND\[/\\index{/g; # do the replacement
   s/]\[/\}{/g; # do the replacement
   print; # print to the modified file
}

das Problem ist die hintere "]" Klammer, da diese nicht eindeutig ist, d.h. ich will nicht alle ] ersetzten sonder nur die, die zu dem String oben gehört.
Ich hatte überlegt im Text nach IND zu suchen und dann die ersten beiden ] und [ die nach IND folgen zu ersetzen(?)

Eine andere Idee wäre nach IND[text][text] zu suchen und den text nicht zu ändern, also in der Art

Code:
s/IND[%%][%%]/\index{%%}{%%}/g

mit % als eine Art Platzhalter. Ginge das?

Danke!
Grobian
 
Zuletzt bearbeitet von einem Moderator:
war nicht dein problem nur die zugehörigen klammern zu ersetzen?
also du hast
IND[text]][text[]]
und willst
\index{text]}{text[]}
erhalten?
wenn nicht verstehe ich dein problem nicht bei deinem ansatz!
 
Hallo,

genau, das war mein Problem. Wenn du mit "meinem Ansatz"

s/IND\[/\\index{/g; # do the replacement
s/]\[/\}{/g; # do the replacement

meinst, dann wäre das Problem die hintere Klammer.

Grüße
Grobian
 
ich will

IND[text][text] in \index{text}{text} ändern. Offensichtlich war mein Ansatz nicht richtig, da ich
schrittweise

1) IND[ -> \index{
2) ][ -> }{
3) ] -> }

machen wollte. Im Text habe ich z.B. Zehn solche Fälle wobei der Text innerhalb der Klammern unterschiedlich ist.
Deshalb ist Schritt 3 nicht möglich, da es im Haupttext auch andere Fälle rechteckigen Klammern gibt.
Deshalb ist deine Lösung optimal. Also alles super.
 
Hmm, so wie ich das sehe haben hesst und ich dein Problem jeweils anders verstanden. Und du hast bei uns beiden auf Nachfrage zugestimmt, dass es das sei.
Ist für mich widersprüchlich. Aber wenn das Problem gelöst ist, ist es ja eigentlich auch egal :)
 
Ich sehe auch immer noch nicht den Unterschied, in deiner Lösung ersetze ich doch auch nur die dazugehörigen Klammern.
Ich will natürlich versuchen, die Fragen aus "Effizienzgründen" korrekt zu stellen..;-)

Was mich noch interessieren würde: kann ich nur den geänderten String in ein neues File schreiben?
Im Moment macht der Befehl s/alt/neu/g aus dem Text
"alles alte Fragen von alten Säcken" den Text "alles neue Fragen von neuen Säcken"

es soll aber im neuen Text nur "neue neuen" stehen

Grüße
Grobian
 
Ich sehe auch immer noch nicht den Unterschied
Hä?
Soll das eine Reaktion auf meine Aussagen bezüglich der unterschiedlichen Wahrnehmungen von hesst und mir sein?

in deiner Lösung ersetze ich doch auch nur die dazugehörigen Klammern.
Mein Vorschlag macht exakt das, was in deinem ersten Post oben im ersten Satz als Anforderung stand. Den Rest dieses erwähnten Posts habe ich ignoriert, weil ich es nicht verstanden habe (ob das die Diff zwischen hesst und mir erklärt?). Dein erster Satz hingegen war klar und eindeutig, den habe ich umgesetzt.

Ich will natürlich versuchen, die Fragen aus "Effizienzgründen" korrekt zu stellen..;-)
Hä?

Im Moment macht der Befehl s/alt/neu/g aus dem Text
"alles alte Fragen von alten Säcken" den Text "alles neue Fragen von neuen Säcken"
Nein, macht er nicht. Er macht mehr als das. Oder bist du schon wieder bei einer neuen Anforderung?

es soll aber im neuen Text nur "neue neuen" stehen
Ja, dann würde ich einen ähnlichen Regex in einer Abfrage nutzen und mir unmittelbar darunter $1 und $2 in eine Variable nehmen.
 
Ich wollte die Klammern ändern, was ich im ersten Satz angesprochen hatte. Danach habe ich skizziert, welchen Ansatz ich hatte, der ja nicht funktioniert. Dann hattest du die Lösung, alles super. Dann kam die Bemerkung von hesst, dass ich doch nur die Klammern ändern will und er meinen Ansatz nicht versteht.....
Und in meinem letzten Post wollte ich nur fragen, was bei Euch beiden widersprüchlich ist.
 
Nachtrag: vielleicht hat der falsche Ansatz und die ungenaue Formulierung im ersten Post den Eindruck geweckt, ich wolle etwas anderes, als Klammern tauschen(?)
 
Also wenn in den eckigen Klammern etwas komplexeres drin steht, wirst du da mit RegExp nicht wirklich glücklich werden. Solange da aber keine eckigen Klammern selbst innerhalb der eckigen Klammern drin stehen, sollte der Ansatz von mikdoe reichen.
 
Zurück
Oben