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}