首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OS上的csplit不能将'$‘识别为行尾字符吗?

OS上的csplit不能将'$‘识别为行尾字符吗?
EN

Stack Overflow用户
提问于 2013-02-20 03:25:09
回答 1查看 1.6K关注 0票数 5

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

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

csplit filename /Reserved$/

收益率

csplit: Reserved$: no match

这是一个显而易见的谎言。如果我省略了$,它可以工作;但我希望确保不会在文本中间出现任何“保留”的错误。我用行首字符^尝试了一个不同的单词,这似乎是有效的。其他单词(出现在数据行尾)在使用时也不匹配(例如and$)。

这是OS的一个已知错误吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 07:05:47

我已经从http://www.opensource.apple.com/source/text_cmds/text_cmds-84/csplit/csplit.c下载了csplit的源代码,并在调试器中对其进行了测试。

该模式是用

代码语言:javascript
复制
if (regcomp(&cre, re, REG_BASIC|REG_NOSUB) != 0)
    errx(1, "%s: bad regular expression", re);

并将这些行与

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

在快速而肮脏地插入

代码语言:javascript
复制
    p[strlen(p)-1] = 0;

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

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

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

代码语言:javascript
复制
csplit filename /Reserved<Ctrl-V><Ctrl-J>/

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14965715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档