这个是否通过正则表达式定义满足我的规范?

时间:2012-02-04 21:47:35

标签: regex sed

我想从Unix cal输出制作Latex表代码,例如它应该看起来像:

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 个答案:

答案 0 :(得分:2)

好吧,如果你可以使用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," \\\\")
     }' 
如果没有太多的正则表达式,

会做一些非常相似的事情......

无论如何,从我的观点来看,你不需要那些\?,因为他们(被捕获的群体)必须始终存在。

答案 1 :(得分:0)

我的正则表达式符合规范。这是因为表达式树从左边贪婪地扩展,所以如果有可能的匹配包括第一个子表达式,那么它将采用这个。