结果

结果

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# 但不包含以以下内容开头的行%%##

注:以上内容部分源自这里。另外,“两步”解决方案(首先提取以...开头的所有行,然后提取所有块)也可能是可能的(我只是不知道如何操作,而且似乎允许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}

相关内容