sed를 사용하여 첫 번째로 일치하는 문자로 교체

sed를 사용하여 첫 번째로 일치하는 문자로 교체

라텍스 코드를 업데이트해 보세요. 네 줄:

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}$

관련 정보