寻找正确的csplit正则表达式

slh*_*hck 10 regex split

我有一个包含以下几行的文件:

1291126929200 started 88 videolist15.txt 4 Good 4
1291126929250 59.875 29.0 29.580243595150186 43.016096916037604
1291126929296 59.921 29.0 29.52749417740926 42.78632483544682
1291126929359 59.984 29.0 29.479540161281143 42.56031951027556
1291126929437 60.046 50.0 31.345036510255586 42.682281485516945
1291126932859 started 88 videolist15.txt 5 Good 4
Run Code Online (Sandbox Code Playgroud)

我想分割包含started(或videolist无关紧要)的每一行的文件.

以下命令仅生成2个输出文件:

$ csplit -k input.txt /started/
Run Code Online (Sandbox Code Playgroud)

但是我期待更多,如下所示:

$ grep -i started input.txt |wc -l
$ 146
Run Code Online (Sandbox Code Playgroud)

什么是正确的csplit命令?

谢谢

cod*_*ict 11

{*}最后添加:

$ csplit -k input.txt /started/ {*}
Run Code Online (Sandbox Code Playgroud)

手册页说:

{*}    repeat the previous pattern as many times as possible.
Run Code Online (Sandbox Code Playgroud)

演示:

$ cat file
1
foo
2
foo
3
foo
$ csplit -k file /foo/ {*}
2
6
6
4
$ ls -tr xx*             
xx03  xx02  xx01  xx00
$ csplit --version
csplit (GNU coreutils) 7.4
Run Code Online (Sandbox Code Playgroud)

  • @slhck不支持OSX {*},但您可以使用homebrew(`brew install coreutils`)来获取流行命令行工具的gnu版本.你可以通过在命令名前加一个'g'来访问它们,比如在这种情况下`gcsplit`. (10认同)
  • @slhck` {*}`是一个方便的GNU扩展.其他`csplit`实现需要明确的重复计数.有时你可以使用非常大的数字(`{999999999}`),有时你需要[第一次使用`grep`](http://unix.stackexchange.com/questions/46325/how-can- I-分裂一个文本文件 - 到 - 多文本的文件/ 46330#46330). (6认同)
  • 不幸的是,这给了我:`csplit:*}:糟糕的重复计数.不过,它可以使用任意数字.谢谢你的提示. (2认同)
  • 我懂了。我有与 OS X 捆绑在一起的 BSD 版本,它甚至没有 `--version` 开关。 (2认同)

cba*_*are 5

根据 Open Group 规范,csplit命令接受基本正则表达式

基本 REGEXP 是完整正则表达式实现的有限子集。它们支持文字字符、星号 (*)、点 (.)、字符类 ([0-9]) 和锚点 (^,$)。它们支持一个或多个 (+) 或交替 (a|b)。

  • @slhck 此信息可能会帮助其他在尝试在自己的情况下使用 csplit 时偶然发现此问题的人吗? (5认同)