Nicht gieriger regulärer Ausdruck zum Konvertieren von Befehlstags

5

Hintergrund

Betrachten Sie den folgenden Text:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use <cmd>rm</cmd> for
serif, <cmd>ss</cmd> for sans serif, and <cmd>tt</cmd> for teletype.

Ich möchte ändern <cmd>x</cmd>zu {{cmd|x}}, wie folgt:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use {{cmd|rm}} for
serif, {{cmd|ss}} for sans serif, and {{cmd|tt}} for teletype.

Problem

Der reguläre Ausdruck für nicht gierige Matches ist schwierig. In vim funktioniert beispielsweise Folgendes nicht:

:%s/<cmd>\(.*\)<\/cmd>.\{-}/{{cmd|\1}}/

Auch nicht das Folgende mit sed:

sed -e "/(<cmd>\(.*\)</cmd>).\{-}/{{cmd|\1}}/"

Die Klammern versuchen, mit den Klammern übereinzustimmen, anstatt den Ausdruck zu gruppieren, um den nicht gierigen Operator von entweder \{-}oder anzuwenden ?. Das Ausblenden der Klammer wird für Rückverweise verwendet, die nur für den Textinhalt innerhalb des <cmd>Tags erforderlich sind .

Frage

Was ist die richtige Syntax, um nicht gierig alle Vorkommen von <cmd>x</cmd>mit {{cmd|x}}in einer Datei zu ersetzen ?

Hinweis: Dies ist kein Versuch, HTML mit Regex zu analysieren. ;-)

Dave Jarvis
quelle

Antworten:

5

Ich habe dies in VIM: %s/<cmd>\(.\{-}\)<\/cmd>/{{cmd|\1}}/gversucht und es konvertiert Ihren Demo-Text in:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use {{cmd|rm}} for
serif, {{cmd|ss}} for sans serif, and {{cmd|tt}} for teletype.

Es scheint, als ob Ihr erster regulärer Ausdruck in VIM wirklich nahe daran ist, Ihr Rätsel zu lösen, aber die Verwendung von .\{-}ist nicht am richtigen Ort.

Ich erhalte den Hinweis aus dieser Antwort: https://stackoverflow.com/questions/1305853/how-can-i-make-my-match-non-greedy-in-vim

phe0113
quelle