ラテックスコードを更新してみてください。 4行:
something $^\text{TT}$ and more stuff
something $^\text{T}$ and more stuff
something $^\text{M\times N}$ and more stuff
something $^\text{T} {otherstuff}$
しなければならない
something $^{\text{TT}}$ and more stuff
something $^{\text{T}}$ and more stuff
something $^{\text{M\times N}}$ and more stuff
something $^{\text{T}} {otherstuff}$
つまり、上付き文字を extra で囲みます{...}
。
私の試みはsed
以下を使用します
sed 's/\^\\text{\(.*\)}/\^{\\{text{\1}}/' testregex
これは最初の3行では機能しますが、最後の行は機能せずに生成されます。
something $^{\text{T} {otherstuff}}$
代わりに。問題はsed
各行の最後の行と一致することですが、それ以降の最初の行と}
一致する必要があります。}
\text{
また、これが同じ行で複数回動作できる場合は良いでしょう。
^\text{1} la la la ^\text{2}
しなければならない
^{\text{1}} la la la ^{\text{2}}
少しだけ修正すれば正常に動作できると確信しています。でも理解できなくて狂ってしまうのです。よろしくお願いします!
答え1
貪欲な正規表現の問題を克服する1つの方法は、区切り文字が続く非区切り文字列を明示的に見つけることです。同時に、次の方法で代替構文を簡素化できます。
sed 's/\^\(\\text{[^}]*}\)/\^{\1}/' input.tex
働かなければならない
sed 's/\^\(\\text{[^}]*}\)/\^{\1}/g' input.tex
1行に複数の一致があります。
答え2
ほぼ全部来ました!次の\text{}
ように、ブロック内で\\text{\(.*\)}
「0個以上の文字」を見つけるのではなく}
:
$ sed 's/\^\\text{\([^}]*\)}/\^{\\{text{\1}}/g' foo.tex
something $^{\{text{TT}}$ and more stuff
something $^{\{text{T}}$ and more stuff
something $^{\{text{M\times N}}$ and more stuff
something $^{\{text{T}} {otherstuff}$
最後に追加したIはg
グローバルマッチングを有効にします。つまり、その行のすべての一致が置き換えられます。これは一致が重複しないと仮定し、次の場合には適用されません。
something $^{\{text{$^{\{text{BB}}$}}$ and more stuff
私はこれがここで問題ではないと仮定します。
答え3
私はこれを提供する:
$ sed 's/\$\^\\\([^}]*\)/$^\{\\\1}/' file
something $^{\text{TT}}$ and more stuff
something $^{\text{T}}$ and more stuff
something $^{\text{M\times N}}$ and more stuff
something $^{\text{T}} {otherstuff}$