결과

결과

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}

관련 정보