我想从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)?如果没有,是否会有一些转换来改变它的正确行为(所以我可以知道如何避免它/控制行为)?
答案 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)
我的正则表达式符合规范。这是因为表达式树从左边贪婪地扩展,所以如果有可能的匹配包括第一个子表达式,那么它将采用这个。