Ich habe Hunderte von Textdateien, die chemische Formeln zusammen mit Erzählungen einschließlich numerischer Werte enthalten. Vor den Formeln stehen immer Leerzeichen, gefolgt von Leerzeichen, Kommas, Punkten usw.
Das Problem ist: Die Formeln sind nicht so formatiert, dass Zahlen als Indizes angezeigt werden, z.
H 2 SO 4, C 5 H 11 OH.
Ich möchte die Indizes als HTML-Tags formatieren, z.
H<sub>2</sub>SO<sub>4</sub>, C<sub>5</sub>H<sub>11</sub>OH
Damit Indizes in HTML gerendert werden, z.
H 2 SO 4 , C 5 H 11 OH
Ich habe damit gespielt, dies mit Java, PHP usw. zu erreichen, aber die Implementierungen sind notwendigerweise chaotisch und umständlich. Ich vermute, dass es einen eleganten Sed / Awk-Ansatz gibt.
Ein Teil der Lösung besteht eindeutig darin, einen regulären Ausdruck zu erstellen, der mit einem Buchstaben gefolgt von einer oder mehreren Ziffern als Formelerkennungsmechanismus übereinstimmt (es kann falsch positive Ergebnisse geben, die ich später manuell korrigieren werde). Bei einer so identifizierten Formel muss ein sed-Ersatz vor jeder Ziffer oder Ziffernfolge mit dem sub
Tag versehen und anschließend mit einem Sub-Tag-Abschluss versehen werden.
Es muss einen Einzeiler geben, der das macht, aber ich bin über meinem Kopf.
Irgendwelche Ideen?
quelle
Antworten:
Z.B:
sollte den Job machen.
(Ordnen Sie einen Buchstaben gefolgt von einer Gruppe von Ziffern zu und merken Sie sich diesen als \ 1 und \ 2. Ersetzen Sie all diesen durch denselben Buchstaben (\ 1) plus die im
sub
Tag enthaltene Zifferngruppe (\ 2) .)quelle
Da Sie erwähnen, dass möglicherweise falsch positive Ergebnisse später manuell korrigiert werden müssen, sollten Sie eine etwas robustere Form in Betracht ziehen, die die folgenden Einschränkungen enthält:
Mit diesen könnten Sie zum Beispiel versuchen:
Mit der Nicht-POSIX-
-r
Option wird dies etwas besser lesbar, aber weniger portabel:Dies könnte noch weiter verbessert werden, indem sichergestellt wird, dass das gesamte "Wort", an dem gearbeitet wird, keine aufeinanderfolgenden Kleinbuchstaben enthält, und natürlich könnte es noch weiter verbessert werden, indem spezifisch nach jedem möglichen chemischen Symbol gesucht wird, aber das wird immer schicker für weniger Auszahlung. Das oben Genannte sollte bereits falsch positive Ergebnisse drastisch reduzieren.
quelle
-E
statt-r
und „POSIX-y“ bleiben.\?
und\+
...gnu sed
und andere Apps / Implementierungen sind "intelligent", sodass sie diese Qualifikationsmerkmale verstehen, auch wenn sie laut Standard nicht BRE sind.sed
wie ursprünglich geschrieben funktioniert . Ich habe es jetzt behoben, um POSIX-spezifizierte Quantifizierer zu verwenden .Gruppierung und Rückverweise waren der Trick. Danke für den Schub in die richtige Richtung. Am Ende habe ich folgendes verwendet:
Dies toleriert die Fälle, in denen ein Header, z. B. h2, im Dokument vorkommt.
quelle