라텍스 코드를 업데이트해 보세요. 네 줄:
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
이것은 처음 세 행에서는 작동하지만 마지막 행은 작동하지 않고 생성됩니다.
something $^{\text{T} {otherstuff}}$
대신에. 문제는 sed
각 줄의 마지막 줄과 일치하는 것이지만 그 이후의 첫 번째 줄 }
과 일치해야 합니다.}
\text{
또한 이것이 같은 줄에서 여러 번 작동할 수 있다면 좋을 것입니다.
^\text{1} la la la ^\text{2}
되어야 한다
^{\text{1}} la la la ^{\text{2}}
약간만 수정하면 제대로 작동할 수 있을 거라 확신합니다. 하지만 이해가 되지 않아 미칠 지경입니다. 미리 감사드립니다!
답변1
욕심 많은 정규식 문제를 극복하는 한 가지 방법은 구분 기호가 뒤에 오는 비구분 기호 문자열을 명시적으로 찾는 것입니다. 동시에 다음을 통해 대체 구문을 단순화할 수 있습니다.
sed 's/\^\(\\text{[^}]*}\)/\^{\1}/' input.tex
작동해야 한다
sed 's/\^\(\\text{[^}]*}\)/\^{\1}/g' input.tex
한 줄에 여러 개의 일치 항목이 있습니다.
답변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}$