匹配来自 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:
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
我有一个 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:
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