Соответствует ли это моим требованиям по определению регулярных выражений? - PullRequest
1 голос
/ 05 февраля 2012

Я хочу сделать код латексной таблицы из вывода Unix cal, например, Это должно выглядеть так:

Mo  & Tu  & We  & Th  & Fr  \\
    &     &  1  &  2  &  3  \\
 6  &  7  &  8  &  9  & 10  \\
13  & 14  & 15  & 16  & 17  \\
20  & 21  & 22  & 23  & 24  \\
27  & 28  &  &  &  \\

Я придумал следующее решение:

cal | sed -e '1d; /^$/d; s/^\(...\)\?\(...\)\?\(...\)\?\(...\)\?\(...\)\?\(...\)\?.*/\2 \& \3 \& \4 \& \5 \& \6 \\\\/'

Работает как шарм! Но я не уверен, что результат определен. Разве это не было бы правильным поведением, например для первой группы, чтобы соответствовать пустой строке, и для второй группы, чтобы соответствовать первым трем символам любой строки (вместо символов 4-6)? И если нет, был бы какой-то переключатель, чтобы сделать его правильное поведение (чтобы я мог знать, как этого избежать / контролировать поведение)?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Хорошо, если вы можете использовать awk:

cal | awk 'BEGIN { OFS = " & " }
     NR == 1 || $0 ~ "^$" { next }
     NR == 2 { for (i=1;i<NF;i++) { printf("%-2s%s",$i,OFS) }
       printf("%s %s\n",$NF," \\\\")
       next 
     } 
     { for (i=1;i<NF;i++) { printf("% 2i%s",$i,OFS) }
       printf("% 2i%s\n",$NF," \\\\")
     }' 

сделает что-то действительно похожее без слишком большого количества регулярных выражений ...

В любом случае, с моей точки зрения, выэти \? нужны, поскольку они (захваченные группы) должны присутствовать всегда.

0 голосов
/ 12 июля 2012

Мое регулярное выражение выполняет спецификацию.Это связано с тем, что дерево выражений жадно разворачивается слева, поэтому, если существует возможное совпадение, включающее в себя первое подвыражение, оно примет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...