匹配来自 tex 的不同行上的多个正则表达式组以打印到 csv

Match multiple regex groups on different lines from a tex to print into csv

我有一个 beamer 乳胶文件,在该文件中,一些帧的形式为

\frame{\frametitle{Title01}
Sub01\
\begin{tabular}{|p{7cm}|}
\hline
\rowcolor{black}\
\rowcolor{white}\
\rowcolor{green}\
\hline
\end{tabular}
}

我想以这样的 csv 格式结束

Title01,Sub01,black,white,green
Title02,Sub02,red,white,blue

到目前为止,我已经设法获得了所有标题

sed -rn 's/^.*frametitle\{(.*)\}/,/pm' f.tex

我无法在下一行中匹配第二组 Sub01(目前使用 latexlinebreak \),这是我目前尝试过的一小部分

sed -rn 's/^.*frametitle\{(.*)\}\n(.*)$/,/mp' f.tex
sed -rn 's/^.*frametitle\{(.*)\}$^(.*)$/,/mp' f.tex
sed -rn 's/^.*frametitle\{(.*)(\}\n)(.*)$/,/mp' f.tex
sed -rn 's/^.*frametitle\{(.*)\}\n(.*)\n/,/mp' f.tex

全部匹配,要么只匹配标题,要么根本不匹配。

这可能对你有用 (GNU sed):

sed -n '/^\frame{\frametitle{\(.*\)}.*/{s///;h;n;s/\([^\]*\).*//;H;:a;n;/^\rowcolor{\(.*\)}.*/{s///;H};/^}/!ba;g;s/\n/,/gp}' file

这是一个过滤作业,因此使用 -n 选项只打印您想要的内容。

所需数据位于 \frame{\frametitle{...} 开始的行和 } 开始的行结束之间。

使用上述条件,将所需的匹配数据复制到保留 space 中,并在匹配结束时用复制的数据替换当前行。

数据将用换行符分隔,所以用逗号替换它们并打印出结果。

像这样在多行模式下使用:

perl -0ne '
    my @a = ( 
        /.*?frametitle\{(\w+)\}\R                           # first line
        (\w+)                                               # second line
        .*rowcolor\{(\w+).*rowcolor\{(\w+).*rowcolor\{(\w+) # other lines
        /sx
    );
    END{
        print join(",", @a) . "\n";
    }
' file