sedを使用して最初に一致する文字に置き換える

sedを使用して最初に一致する文字に置き換える

ラテックスコードを更新してみてください。 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}$

関連情報