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
.