結果

結果

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}

関連情報