結果

結果

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範囲演算子 (,) を使用すると、この目的に非常にうまく機能します。末尾に追加のフィルターをタグ付け (;) すると、なんと、完了です。

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}

関連情報