Более 1 разделителя в регулярном выражении в команде csplit - PullRequest
1 голос
/ 19 августа 2011

Я пытаюсь использовать команду csplit для разделения файла на 3 строковых разделителя, но у меня возникают проблемы.Я не получил cplist для работы со списком разделителей.Это то, что я пробую:

У меня есть этот файл:

 TRANSHEADER002_XA
 XAL1
 XAL2
 XAL3
 TRANSHEADER001_EXEC
 EXECL1
 EXECL2
 EXECL3
 TRANSHEADER003_YB
 YBL1
 YBL2
 YBL3
 TRANSHEADER002_XA
 XAL1A
 XAL2A
 XAL3A

Это разделители строк

 TRANSHEADER002_XA
 TRANSHEADER001_EXEC
 TRANSHEADER003_YB

, но я не получаю успехкогда я пытаюсь использовать команду csplit с более чем 1 разделителем следующим образом

 csplit -k -s -f "$file"_split. "$file" "/^\(TRANSHEADER002_XA\|TRANSHEADER001_EXEC\|TRANSHEADER003_YB\)/" "{999}"
 csplit -k -s -f "$file"_split. "$file" "/^(TRANSHEADER002_XA|TRANSHEADER001_EXEC|TRANSHEADER003_YB)/" "{999}"
 csplit -k -s -f "$file"_split. "$file" "/^TRANSHEADER002_XA|^TRANSHEADER001_EXEC|^TRANSHEADER003_YB/" "{999}"

Я получил ошибку «вне диапазона», как показано ниже, для любой из команд выше

 /^\(TRANSHEADER002_XA\|TRANSHEADER001_EXEC\|TRANSHEADER003_YB\)/ - out of range

Iхотите разделить этот файл, как показано ниже

 --> file_split.01
 TRANSHEADER002_XA
 XAL1
 XAL2
 XAL3

 --> file_split.02
 TRANSHEADER001_EXEC
 EXECL1
 EXECL2
 EXECL3

 --> file_split.03
 TRANSHEADER003_YB
 YBL1
 YBL2
 YBL3

 --> file_split.04
 TRANSHEADER002_XA
 XAL1A
 XAL2A
 XAL3A

Ребята, вы знаете, как я могу это сделать, используя csplit или другую команду, которая выдала бы мне файлы разделения, как я показал выше?* Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 20 августа 2011

С вашим файлом примера это сработало для меня:

csplit -zksf file_split. csplit.test.txt '/^TRANSHEADER\(002_XA\|001_EXEC\|003_YB\)/' '{*}'

Использование {*} устраняет ошибку вне допустимого диапазона, поскольку она совпадает столько раз, сколько может, вместо того, чтобы пытаться точно 999 раз.

Я также уменьшил ваше регулярное выражение, но это не относится к делу.

(я вижу, Михал побил меня до этого)

0 голосов
/ 19 августа 2011

Не следует повторять шаблон 999 раз, но используйте параметр, предназначенный для повторения его столько раз, сколько необходимо: {*}:

csplit -kszf "$file"_split. "$file" "/^TRANSHEADER002_XA\|TRANSHEADER001_EXEC\|TRANSHEADER003_YB/" "{*}"

Также используйте параметр -z, чтобы удалить пустой выводфайлы.

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