我已经从http://www.opensource.apple.com/source/text_cmds/text_cmds-84/csplit/csplit.c下载了 csplit 的源代码,并在调试器中进行了测试。
该模式是用
if (regcomp(&cre, re, REG_BASIC|REG_NOSUB) != 0)
errx(1, "%s: bad regular expression", re);
并且线条匹配
/* Read and output lines until we get a match. */
first = 1;
while ((p = csplit_getline()) != NULL) {
if (fputs(p, ofp) == EOF)
break;
if (!first && regexec(&cre, p, 0, NULL, 0) == 0)
break;
first = 0;
}
现在的问题是返回的行csplit_getline()仍然有一个尾随换行符\n。因此,“Reserved”不是字符串中的最后一个字符,并且模式“Reserved$”不匹配。
在快速而肮脏的插入后
p[strlen(p)-1] = 0;
要从输入字符串中删除尾随换行符,“Reserved$”模式按预期工作。
Mac OS X 中的 csplit 似乎存在更多问题,请参阅为 csplit 寻找正确的正则表达式的答案的备注(重复计数{*}也不起作用)。
备注:您可以使用以下技巧匹配行尾的“Reserved”:
csplit filename /Reserved<Ctrl-V><Ctrl-J>/
您实际使用 Control 键在命令行上输入换行符的位置。