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}