Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX上的csplit是否不识别'$';作为行尾字符?_Macos_Unix - Fatal编程技术网

Macos OSX上的csplit是否不识别'$';作为行尾字符?

Macos OSX上的csplit是否不识别'$';作为行尾字符?,macos,unix,Macos,Unix,(我使用的是Mac OS X,这个问题可能是特定于该Unix变体的) 我正在尝试使用带有正则表达式的csplit拆分文件。它由合并到单个长文本文件中的各种文章组成。每一条以“保留所有权利”结尾。这是在这行的末尾:grep Reserved$找到了它们。只有,csplit声称没有匹配项 csplit文件名/保留$/ 屈服 csplit:Reserved$:不匹配 这是一个明显的谎言。如果我省略了$,它会工作;但我想确保我不会在文章的中间出现任何“保留”的杂乱无章。我尝试了一个不同的单词,它的行首字

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

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

csplit文件名/保留$/

屈服

csplit:Reserved$:不匹配

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

这是OSX的已知错误吗


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

我已从下载了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\u getline()
返回的行仍然有一个尾随的换行符
\n
。因此,“Reserved”不是字符串中的最后一个字符,模式“Reserved$”不匹配

在快速而肮脏地插入

    p[strlen(p)-1] = 0;
要从输入字符串中删除尾随的换行符,“Reserved$”模式按预期工作

Mac OS X中的csplit似乎存在更多问题,请参见的答案的备注(重复计数
{*}
也不起作用)

备注:您可以使用以下技巧匹配行尾的“保留”:

csplit filename /Reserved<Ctrl-V><Ctrl-J>/
csplit文件名/保留/

您可以使用控制键在命令行中输入换行符。

谢谢!我尝试了
拆分文件名/保留。$/
这同样有效@奥利弗马森:我明白了,这也是一个很好的解决方案/解决办法(点匹配换行符)。