0

我正在尝试csplit在 BASH 中使用 1500-1600 的年份分隔文件作为分隔符。

当我执行命令时

csplit Shakespeare.txt '/1[56]../' '{36}'

它几乎可以工作,除了至少两个问题:

  1. xx00这将输出 38 个文件,而不是 36 个,编号为xx37. (也xx00完全空白。)我不明白这怎么可能。
  2. 其中一个文件(为什么似乎csplit返回 37 个非空文件而不是我预期的 36 个非空文件)不是以 15XX 或 16XX 开头——它以“ACT 4 SCENE 15\n”开头(其中 \n 应该表示换行符或换行符)。我不明白如何csplit将新行/换行符与数字匹配。

当我执行命令时(这就是我想要的)

csplit Shakespeare.txt '/1[56][0-9][0-9]/' '{36}'

终端返回错误:csplit: 1[56][0-9][0-9]: no match加上在执行上述操作时列出的所有数字。

这对我来说尤其没有意义,因为grep另有说明:

grep -c "1[56][0-9][0-9]" Shakespeare.txt
36

grep -c "1[56].." Shakespeare.txt
36

注: man csplit表示我有2005年1月26日以后的BSD版本。man grep表示我有2010年7月28日以后的BSD版本。

4

1 回答 1

0

根据用户 'DRL' 在 2008 年 6 月 20日给出的答案,我决定尝试将-k选项添加到csplit.

csplit -k Shakespeare.txt '/^1[56][0-9][0-9]/' '{36}'

这返回了一个错误:csplit: ^1[56][0-9][0-9]: no match

但是,它仍然(或多或少)提供了所需的输出:xx00.txt通过xx36.txtnot xx37.txt)的文件和每个非空文件xx01.txt-xx36.txt具有预期/所需的内容。(特别是没有以“ACT 4 SCENE 15”开头的文件。

的手册页对标志进行csplit了以下说明:-k

-k 如果发生错误或收到 HUP、INT 或 TERM 信号,则不删除输出文件。

老实说,我不太明白这意味着什么,但我仍然有以下关于此解决方案为何有效/有效的猜想:

猜想: csplit期望文件的开头与正则表达式匹配。因此,由于文件的开头行不匹配^1[56][0-9][0-9],它发脾气并退出,没有-k标志。

尽管如此,我仍然不明白为什么1[56][0-9][0-9]没有工作,也许是同样的原因。而且我绝对不明白为什么1[56]..不起作用(即为什么csplit产生了第 37 个文件不以模式开头)。

于 2017-09-25T21:58:55.857 回答