OS X 上的 csplit 是否无法将“$”识别为行尾字符?

Oli*_*son 5 unix macos

(我使用的是 Mac OS X,这个问题可能特定于该 Unix 变体)

我正在尝试使用csplit正则表达式拆分文件。它由合并成一个长文本文件的各种文章组成。每篇文章都以“保留所有权利”结尾。这是在行的末尾:grep Reserved$找到它们。只是,csplit声称没有匹配项。

csplit filename /Reserved$/

产量

csplit: Reserved$: no match

这是一个明显的谎言。如果我省略$,它会起作用;但我想确保在文本中间不会出现任何“保留”字样。我用行首字符尝试了一个不同的词^,这似乎有效。其他词(确实出现在数据行的末尾)在使用时也不匹配(例如and$)。

这是 OS X 的已知错误吗?

[更新:我通过删除所有回车符确保这不是 DOS/Unix 行结束字符问题]

Mar*_*n R 4

我已经从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);
Run Code Online (Sandbox Code Playgroud)

并且这些行与

/* 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;
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是返回的行csplit_getline()仍然有一个尾随换行符\n。因此,“Reserved”不是字符串中的最后一个字符,并且模式“Reserved$”不匹配。

快速而肮脏地插入后

    p[strlen(p)-1] = 0;
Run Code Online (Sandbox Code Playgroud)

要从输入字符串中删除尾随换行符,“Reserved$”模式按预期工作。

Mac OS X 中的 csplit 似乎存在更多问题,请参阅“寻找 csplit 的正确正则表达式”答案的备注(重复计数{*}也不起作用)。

备注:您可以使用以下技巧在行尾匹配“Reserved”:

csplit filename /Reserved<Ctrl-V><Ctrl-J>/
Run Code Online (Sandbox Code Playgroud)

实际上,您可以使用 Control 键在命令行上输入换行符。