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

标签 macos unix

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

我正在尝试使用 csplit 拆分文件用正则表达式。它由合并成一个长文本文件的各种文章组成。每篇文章都以“保留所有权利”结尾。这是行尾:grep Reserved$找到它们。只有,csplit声称没有匹配项。
csplit filename /Reserved$/
产量
csplit: Reserved$: no match
这是一个明显的谎言。如果我省略了 $ , 有用;但我想确保在文本中间不会出现任何“保留”字样。我用行首字符尝试了一个不同的单词 ^ ,这似乎有效。其他单词(确实出现在数据中的行尾)在使用时也不匹配(例如 and$ )。

这是 OS X 的已知错误吗?

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

最佳答案

我已经从 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的问题似乎比较多,见Looking for correct Regular Expression for csplit的回答的备注(重复计数 {*} 也不起作用)。

备注:您可以使用以下技巧匹配行尾的“保留”:
csplit filename /Reserved<Ctrl-V><Ctrl-J>/

您实际使用 Control 键在命令行上输入换行符的地方。

关于macos - OS X 上的 csplit 是否无法将 '$' 识别为行尾字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14965715/

相关文章:

c++ - 如何在 Mac OSX 中获取真实的日历微秒时间(自 1970 年以来的纪元)?

linux - 管理 Supervisord 进程 - 开机自动启动/崩溃时自动启动

sql - Bash Shell 脚本中的数据库访问

linux - 是否可以用 AWK 编写语言解析器?

java - 请求关注 JavaFX 阶段不会更改 macOS 左上角菜单栏标题

python - pip3 : Command Not Found on OS X

java - Objective-C + Cocoa 相当于 Java + Swing 的事件调度线程是什么?

python - Busted OS X Python 安装

linux - 在 OS X 中使用重命名更改文件扩展名

linux - Bash 评估 : [ vs ||