infile.tex
다음 형식의 파일이 있습니다(예: ).
AAAA
BBBB AAAA
CCCC BBBB AAAA
%%## Just some text
\begin{example}[foobar]
\begin{Sinput}
> set.seed(271)
> U <- runif(10)
> plot(U, 1-U)
\end{Sinput}
AAAA BBBB CCCC
\begin{Sinput}
> plot(qnorm(cbind(U, 1-U)))
\end{Sinput}
\end{example}
나는%%##
그리고\begin{Sinput}
\end{Sinput}
및 so 사이의 모든 줄
%%## Just some text
\begin{Sinput}
> set.seed(271)
> U <- runif(10)
> plot(U, 1-U)
\end{Sinput}
\begin{Sinput}
> plot(qnorm(cbind(U, 1-U)))
\end{Sinput}
나는 다음과 함께 일하려고 노력합니다 sed
:
sed -n '/%%##\|\\begin{Sinput}/,/\\end{Sinput}/p' infile.tex
# 또한 포함\begin{example}[foobar]
sed -n '/^%%##\|\\begin{Sinput}/,/\\end{Sinput}/p' infile.tex
# 단, 다음으로 시작하는 줄은 포함하지 마세요.%%##
참고: 위 내용의 일부는 다음에서 파생되었습니다.여기. 또한 "2단계" 솔루션(먼저 다음으로 시작하는 모든 줄을 추출한 다음 모든 블록을 추출하는 것)도 가능할 수 있습니다. (방법은 모르겠지만 sed
여러 "패턴"을 선택할 수 있는 것 같으니 다음을 참조하세요. 좀 더 우아해 보이네요)
답변1
awk
범위 연산자(,)는 이를 위해 매우 효과적입니다. 마지막에 추가 필터(;)를 표시하고 서둘러주세요.
awk '/^\\begin\{Sinput\}/,/^\\end\{Sinput\}/;/^%%##/' infile.tex
%%## Just some text
\begin{Sinput}
> set.seed(271)
> U <- runif(10)
> plot(U, 1-U)
\end{Sinput}
\begin{Sinput}
> plot(qnorm(cbind(U, 1-U)))
\end{Sinput}
답변2
sed -e '/^\\begin{Sinput}/,/^\\end{Sinput}/!{/^%%##/!d}'
perl -lne 'print if /^\Q\begin{Sinput}/ .. /^\Q\end{Sinput}/ or /^%%##/'
range
의 연산자 Perl
는 입니다 . 특수 문자를 명시적으로 이스케이프할 필요가 없도록 ..
다음 텍스트를 인용하기 위해 따옴표를 사용합니다 .\Q
결과
%%## Just some text
\begin{Sinput}
> set.seed(271)
> U <- runif(10)
> plot(U, 1-U)
\end{Sinput}
\begin{Sinput}
> plot(qnorm(cbind(U, 1-U)))
\end{Sinput}