如何使用sed打印文件\begin{mcstas}\end{mcstas}foo.tex之间的所有大写单词?

以下示例包含foo.tex的最小示例:

\begin{mcstas}
DEFINE COMPONENT  child_name COPY parent_name
SETTING PARAMETERS (newpar1, newpar2)
INITIALIZE COPY  parent_name EXTEND
SAVE
\end{mcstas}
foo FALSE POSITIVE
\begin{mcstas}
DEFINE COMPONENT  name ...
\end{mcstas}

最佳答案

正如您所问的那样,这有点棘手:\begin{mcstas}可以轻松完成\end{mcstas}sed之间的部分,但最好使用grep而不是sed完成“print all大写单词”部分。因此,如果您只想完成它,则可以执行以下操作:

$ sed '/\\begin{mcstas}/,/\\end{mcstas}/!d' foo.tex | grep -ow '[A-Z]\+'
DEFINE
COMPONENT
COPY
SETTING
PARAMETERS
INITIALIZE
COPY
EXTEND
SAVE
DEFINE
COMPONENT

这是一个执行相同功能(如您最初要求的)的sed命令的样子:
$ sed -n '/\\begin{mcstas}/,/\\end{mcstas}/!d; s/\b/\n/g; :a; /^[A-Z]\+\n/P; s/[^\n]*\n//; ta' foo.tex
DEFINE
COMPONENT
COPY
SETTING
PARAMETERS
INITIALIZE
COPY
EXTEND
SAVE
DEFINE
COMPONENT

关于regex - 如何在与sed和 friend 一起的区域中打印所有大写单词?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18947866/

10-10 22:54