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}
, 그래서
%%## 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
범위 연산자(,)를 사용하면 이에 대해 꽤 잘 작동합니다. 끝에 추가 필터(;)를 태그하고 hey presto를 추가하세요.
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}