OS X上的csplit是否无法识别' $'作为行尾字符?

时间:2013-02-19 19:25:09

标签: macos unix

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

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

csplit filename /Reserved$/

产量

csplit: Reserved$: no match

这是一个明显而明显的谎言。如果我遗漏$,它就会起作用;但我想确保在文本中间不会出现任何“保留”的错误。我尝试了一个与行尾字符^不同的单词,这似乎有效。其他词(在数据中的某一行末尾发生的事情)在使用时也不匹配(例如and$)。

这是OS X的已知错误吗?

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

1 个答案:

答案 0 :(得分: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);

并且行与

匹配
/* 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。因此,“保留”不是字符串中的最后一个字符,并且“保留$”模式不匹配。

快速插入

之后
    p[strlen(p)-1] = 0;

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

在Mac OS X中csplit似乎有更多问题,请参阅Looking for correct Regular Expression for csplit答案的评论(重复计数{*}也不起作用)。

备注:您可以将该行末尾的“保留”与以下技巧相匹配:

csplit filename /Reserved<Ctrl-V><Ctrl-J>/

您实际使用Control键在命令行中输入换行符。