일치하는 괄호를 포함하는 콘텐츠로 교체

일치하는 괄호를 포함하는 콘텐츠로 교체

sed/awk를 사용하여 bash에서 일치하는 연속 괄호를 찾고 포함된 내용으로 바꾸는 쉬운 방법은 무엇입니까?

최소한의 예는 다음과 같습니다:

입력하다:

(body1)

산출:

body1

부적절한 해결책:

이 작업은 다음으로 수행할 수 있습니다.

echo "(body1)" | sed 's/[()]//g'

확장된 질문

그러나 단순히 열기/닫기 괄호를 모두 제거하는 것만으로는 충분하지 않습니다. 최종 목표는 소스 파일에서 전부는 아니지만 일부 (tex) 명령을 제거하는 것이기 때문입니다.

입력하다:

Alea {\color{red}iacta} est. \textbf{Hic} forum est, populus {\color{red}properant}.

산출:

Alea iacta est. \textbf{Hic} forum est, populus properant.

지금까지는 다음을 사용하여 텍스트만 추출할 수 있습니다.

awk -v FS="({\\color{red}|})" '{print $2}' $file.tex

보너스

\color{red} 명령만 제거하는 것도 가능합니다 sed -E 's/\{\\color\{red}([^{}]*)\}/\1/g'. 그러나 명령의 시작과 끝은 같은 줄에 있어야 합니다.

닫는 괄호 앞에 여러 줄에 걸쳐 있는 명령을 제거하는 방법은 무엇입니까 }?

보너스 솔루션

누구든지 관심이 있다면 다음 명령을 사용하여 보너스 문제를 해결하는 것 같습니다. sed -i -r 's#\{\\color\{red\}([^}]*)\}#\1#g' $file.tex sed -i -r ':a;N;$!ba;s#\{\\color\{red\}([^}]*)\}#\1#' $file.tex

첫 번째 명령은 {\color{red}행의 모든 ​​합계를 삭제합니다. }두 번째 명령은 여러 줄에 걸쳐 있는 모든 쌍을 제거합니다.

답변1

처음에 묻는 간단한 질문에도 약간의 복잡성이 숨어 있습니다. 나는 시작할 것이다

sed -E 's/\(([^()]*)\)/\1/'

괄호가 없어질 때까지 반복오른쪽. 이는 가장 안쪽 텍스트를 대체합니다.

$ echo "((body))" | sed -E 's/\(([^()]*)\)/\1/'
(body)

제안대로선행은 이루기가 어렵다detex하지만 TeX 명령을 제거하려면 TeX Live(및 대부분의 배포판)에서 사용 가능한 것이 무엇인지 확인해야 합니다 . 이러한 종류의 처리에는 단순히 괄호나 중괄호를 일치시키는 것 이상이 필요합니다. 즉, 다양한 명령의 동작에 대해 알아야 합니다. 귀하의 예에서도 \color한 가지 방법으로 수행되어야 합니다 \textbf.

관련 정보