Ищете правильное регулярное выражение для csplit - PullRequest
10 голосов
/ 01 декабря 2010

У меня есть файл, который содержит несколько строк, подобных этим:

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

Я хочу разделить файлы для каждой строки, содержащей started (или videolist, не имеет значения).

Следующая команда создает только 2 выходных файла:

$ csplit -k input.txt /started/

Однако я ожидаю гораздо большего, как видно из:

$ grep -i started input.txt |wc -l
$ 146

Какая будет правильная csplit команда?

Спасибо

Ответы [ 2 ]

11 голосов
/ 01 декабря 2010

Просто добавьте {*} в конце:

$ csplit -k input.txt /started/ {*}

На странице руководства написано:

{*}    repeat the previous pattern as many times as possible.

Демо-версия:

$ 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
2 голосов
/ 12 августа 2015

В соответствии со спецификациями Open Group команда csplit принимает базовые регулярные выражения .

Базовые REGEXP являются ограниченным подмножеством полных реализаций регулярного выражения.Они поддерживают буквенные символы, звездочку (*), точку (.), Классы символов ([0-9]) и якоря (^, $).Они не поддерживают одно или несколько (+) или чередование (a | b).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...