У меня есть текстовый файл, который я хочу разделить на 64 неравные части, в соответствии с 64 гексаграммами И Цзин. Поскольку отрывок для каждой гексаграммы начинается с некоторой цифры (цифр), точки и двух новых строк, регулярное выражение должно быть довольно простым для написания.
Но как на самом деле разделить текстовый файл на 64 новых файла в соответствии с этим регулярным выражением? Это кажется более сложной задачей perl
. Но, может быть, есть более очевидный способ, который я просто пропускаю.
источник
'\.'
тоже не сработает?Я думаю, что лучший способ
awk
иgawk
.AWK
-F
будет указывать поля разделитель для каждой строки. Это регулярное выражение, здесь мы используем несколько разделителей:". "
и" / "
. Таким образом строка вроде1. Ch'ien / The Creative
будет разбита на 3 поля:1
Ch'ien
иThe Creative
. Позже мы можем ссылаться на эти поля с$n
.$0
это вся линия.Затем
^[0-9]{1,3}[.]
мы сообщаем awk о соответствии строк шаблону. Если есть соответствие, мы присваиваем значениеx
. Значение x будет использоваться в качестве имени файла дляprint
операции. В этом примере мы используем,"F"$1"("$2").txt"
чтобы строка1. Ch'ien / The Creative
дала имя файлаF1(Ch'ien).txt
простак
В gawk мы также можем получить доступ к захваченной группе. Таким образом, мы можем упростить команду для:
здесь мы используем
match
захват групп и помещаем их в список переменныхary
.$0
это вся линия.ary[0]
все соответствует.ary[1...n]
это каждая группа.Perl
Мы также можем сделать это с помощью Perl:
Результаты:
как получить файл примера:
источник
С помощью GNU coreutils вы можете использовать,
csplit
чтобы разбить файл на части, разделенные регулярным выражением, как показано geekosaur .Вот портативный awk-скрипт для разбиения файла на части. Это работает
getline
для работы с многострочным (2-строчным) разделителем;outfile
для имени файла для печати, когда встречается заголовок раздела.источник
nunber.
следует текст, который содержит косую черту/
. Я почти уверен, что упомянутыйtwo newlines
ixtmixilix - это две пустые строки, которые предшествуют числовому идентификатору и более конкретно идентифицируют заголовок, но, поскольку данные на веб-странице совпадают только/^[0-9]+\.
в заголовках разделов, нет необходимости их обслуживать ( в данном конкретном случае). Благодарность; специально для вступленияgetline
.. PS. может быть, если?while
есть ли в случае, если вход содержит1.\n2.\n\n
(где\n
новые строки):2.
должны быть распознаны в строке заголовка. Это не произойдет здесь, но я поддерживаю это в своем коде, чтобы сделать его более общим (и более точно соответствовать спецификации в вопросе).