私は化学式と数字を含む説明を含む何百ものテキストファイルを持っています。数式の前には常にスペースがありますが、後にスペース、カンマ、ピリオドなどが続くことがあります。
問題は、数字を下付き文字で表示するように数式の形式が指定されていないことです。たとえば、次のようになります。
H2SO4、C5H11OH。
下付き文字をHTMLタグにフォーマットしたいと思います。たとえば、次のようになります。
H<sub>2</sub>SO<sub>4</sub>, C<sub>5</sub>H<sub>11</sub>OH
このように、下付き文字はHTML形式でレンダリングされます。たとえば、次のようになります。
H2SO4、C5H11OH
Java、PHPなどを使用してこれを達成しようとしましたが、実装は必然的に汚れて厄介です。私はエレガントなsed / awkの方法があると思います。
明らかに解決策のいくつかは、数式検出メカニズムで文字の後に1つ以上の数字が続く正規表現を作成することです(エラーがある可能性があり、後で手動で修正します)。次に、このように決定された式が与えられたら、sed置換のために、各数字または数字シーケンスの前にラベルを追加し、sub
その後にサブラベルクロージャを追加する必要があります。
これを行う行があるはずですが、理解できません。
どんなアイデアがありますか?
答え1
たとえば、
sed -r 's:([A-Za-z])([0-9]+):\1<sub>\2</sub>:g'
仕事をしなければなりません。
(文字と数字のグループを一致させ、それを\ 1と\ 2として覚えてください。これらをすべて同じ文字(\ 1)とトークンに含まれる数字のグループ(\ 2)に置き換えます。 sub
)
答え2
後で手動で修正する必要がある誤検出がある可能性があると述べたので、次の制限を組み込むより強力な形式を検討することをお勧めします。
- すべての化学記号スタート大文字で。
- すべての化学記号は、大文字または大文字の後に小文字で構成されます。一時インジケータ私はこれを無視します。
次のように試すことができます。
sed 's|\([[:upper:]][[:lower:]]\{0,1\}\)\([0-9]\{1,\}\)|\1<sub>\2</sub>|g'
POSIX以外の-r
オプションを使用すると、少し読みやすくなりますが、移植性が低下します。
sed -r 's|([[:upper:]][[:lower:]]?)([0-9]+)|\1<sub>\2</sub>|g'
保証することでみんな処理される「単語」には連続した小文字は含まれていません。もちろん、可能なすべての化学記号を具体的に確認することで、さらに改善することができますが、報酬はますます減少し、ますます華やかになります。上記は誤検出を大幅に減らす必要があります。
答え3
グループ化と逆参照は秘密です。正しい方向に進めていただきありがとうございます。結局、私は次のものを使用しました。
sed 's/\([A-Z][a-z]*\)\([0-9][0-9]*\)/\1<sub>\2<\/sub>/g' file
これにより、文書にタイトル(h2など)が含まれます。