Сопоставьте несколько групп регулярных выражений в разных строках из текса для печати в CSV - PullRequest
1 голос
/ 17 июня 2020

У меня есть файл latex 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\{(.*)\}/\1,/pm' f.tex

. Мне не удается сопоставить вторую группу Sub01 (на данный момент с latexlinebreak \) в следующей строке, небольшой выбор из того, что я пробовал до сих пор

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

все совпадают либо только с заголовком, либо совсем без него.

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Это может сработать для вас (GNU sed):

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

Это задание фильтрации, поэтому используйте параметр -n, чтобы печатать только то, что вы хотите.

Данные required существует между строкой, начинающейся \frame{\frametitle{...}, и заканчивающейся строкой, начинающейся }.

Используя вышеуказанные критерии, скопируйте требуемые совпадающие данные в пространство удержания и при обнаружении конца совпадения замените текущая строка скопированными данными.

Данные будут разделены символами новой строки, поэтому замените их запятыми и распечатайте результат.

0 голосов
/ 17 июня 2020

Вот так, используя в многострочном режиме :

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
...