разделение текстовых файлов в соответствии с регулярным выражением

Вставив в текстовый редактор, у меня есть текстовый файл, полученный из онлайн-версии перевода Вильгельма Йи Цзин, который я теперь хочу разбить на 64 неравные части, согласно 64 гексаграммам Йи Цзин. Поскольку проход для каждой гексаграммы начинается с некоторой цифры (цифр), периода и двух строк новой строки, регулярное выражение должно быть довольно легко писать. Но как я действительно разбил текстовый файл на 64 новых файла в соответствии с указанным регулярным выражением? Могу ли я sed команду sed для split ? (Это просто не похоже, что это сработает. Похоже, что это больше для задачи perl . Но, возможно, есть более очевидный способ, который я просто полностью отсутствует.)

3 Solutions collect form web for “разделение текстовых файлов в соответствии с регулярным выражением”

Это будет csplit за исключением того, что регулярное выражение должно быть одной строкой. Это также делает sed сложным; Я бы пошел с Perl или Python.

Вы могли видеть,

 csplit foo.txt '/^[0-9][0-9]*\.$/' '{64}' 

достаточно хорош для ваших целей. ( csplit требует POSIX BRE, поэтому он не может использовать \d или + , среди прочих.)

С GNU coreutils вы можете использовать csplit чтобы разбить файл на разделы с регулярным выражением, как показано geekosaur .

Вот переносимый awk-скрипт, чтобы разбить файл на куски. Он работает

  • вызов getline для работы с многострочным разделителем (2 строки);
  • установка переменной outfile в имя файла для печати, когда встречается заголовок раздела.
 BEGIN {outfile="header.txt"} { while (/^[0-9]+\.$/) { prev = $0; getline; if ($0 == "") outfile = prev "txt"; print prev >outfile } print >outfile } 

Я думаю, что лучший способ – awk и gawk .

AWK

 awk -F "([.] )|( / )" '/^[0-9]{1,3}[.]/{x="F"$1"("$2").txt";}{print >x;}' I_Ching_Wilhelm_Translation.txt 

-F будет указывать разделители полей для каждой строки. Это регулярное выражение, здесь мы используем несколько разделителей: ". " И " / " . Таким образом, строка типа 1. Ch'ien / The Creative будет разделена на 3 поля: 1 Ch'ien и The Creative . Позже мы можем обратиться к этим полям с помощью $n . $0 – вся строка.

Затем мы укажем awk на соответствие строкам с рисунком ^[0-9]{1,3}[.] Если есть совпадение, тогда мы присваиваем значение x . Значение x будет использоваться как имя файла для операции print . В этом примере мы используем "F"$1"("$2").txt" так что строка 1. Ch'ien / The Creative дает имя файла F1(Ch'ien).txt

простофиля

В gawk мы также можем получить доступ к захваченной группе. Поэтому мы можем упростить команду:

 gawk 'match($0, /^([0-9]{1,3})[.] (.*) \/ (.*)$/, ary){x="F"ary[1]"("ary[2]")";}{print >x;}' I_Ching_Wilhelm_Translation.txt 

здесь мы используем match с захватом групп и помещаем их в переменный список ary . $0 – вся строка. ary[0] – все согласовано. ary[1...n] – каждая группа.

Perl

Мы также можем сделать это с помощью perl:

 perl -ne 'if(/^([0-9]{1,3})[.] (.*) \/ (.*)$/) {close F; open F, ">", sprintf("F$1($2).txt");} print F' I_Ching_Wilhelm_Translation.txt 

Результаты:

 > ls F* F10(Lü).txt F22(Pi).txt F34(Ta Chuang).txt F46(Shêng).txt F58(Tui).txt F11(T'ai).txt F23(Po).txt F35(Chin).txt F47(K'un).txt F59(Huan).txt F12(P'i).txt F24(Fu).txt F36(Ming I).txt F48(Ching).txt F5(Hsü).txt F13(T'ung Jên).txt F25(Wu Wang).txt F37(Chia Jên).txt F49(Ko).txt F60(Chieh).txt F14(Ta Yu).txt F26(Ta Ch'u).txt F38(K'uei).txt F4(Mêng).txt F61(Chung Fu).txt F15(Ch'ien).txt F27(I).txt F39(Chien).txt F50(Ting).txt F62(Hsiao Kuo).txt F16(Yü).txt F28(Ta Kuo).txt F3(Chun).txt F51(Chên).txt F63(Chi Chi).txt F17(Sui).txt F29(K'an).txt F40(Hsieh).txt F52(Kên).txt F64(Wei Chi).txt F18(Ku).txt F2(K'un).txt F41(Sun).txt F53(Chien).txt F6(Sung).txt F19(Lin).txt F30(Li).txt F42(I).txt F54(Kuei Mei).txt F7(Shih).txt F1(Ch'ien).txt F31(Hsien).txt F43(Kuai).txt F55(Fêng).txt F8(Pi).txt F20(Kuan).txt F32(Hêng).txt F44(Kou).txt F56(Lü).txt F9(Hsiao Ch'u).txt F21(Shih Ho).txt F33(TUN).txt F45(Ts'ui).txt F57(Sun).txt 

как получить файл примера:

 curl http://www2.unipr.it/~deyoung/I_Ching_Wilhelm_Translation.html|html2text -o I_Ching_Wilhelm_Translation.plain sed 's|^[[:blank:]]*||g' I_Ching_Wilhelm_Translation.plain > I_Ching_Wilhelm_Translation.txt 
  • Как работает «$» в «apt-cache search something $»
  • Что означает ^> в шаблоне grep?
  • awk с регулярным выражением для разделителя
  • Используйте регулярное выражение, чтобы проверить, имеет ли конкретный каталог папки, начиная с определенного слова
  • Расширенные регулярные выражения (ERE): как включить шаблон, но исключить конкретный надмножество шаблона в матчах?
  • Подстановка первого вхождения шаблона в строку, для всех строк в файле с sed
  • находить и удалять файлы старше конкретных дней и иметь определенную строку в именах файлов
  • Заменить с помощью vim - Заменить шаблон на строку
  • Как объединить grep с файлом и дополнительным регулярным выражением
  • Простой регулярный матч не работает
  • Удаление цветовых кодов из вывода
  • Interesting Posts

    Запись в файл bash в файл

    Почему у меня так много файлов /etc/resolv.conf.dhclient-new.xxxx?

    Почему компакт-диск Debian имеет 52 CD

    Как тайм-аут и выход, если SQL-запрос занимает более 10 минут, чтобы получить результаты

    С оболочкой. Сделать сценарий ожидания завершения Gnome-терминала

    Как определить точную спецификацию моего диска на облачном сервере?

    Если возможно установить постоянную настройку маршрутизации для всех ip-пакетов на определенный IP-адрес?

    Как отбросить пакет, если запись conntrack отсутствует

    Получать файлы с сервера SFTP и управлять ими в памяти

    incrontab по имени папки, содержащей линейные каналы

    Условия, отправленные через ssh, выполняются локально, а не удаленно

    Проблема с конкретными приложениями?

    Использование crc32 для поиска поврежденных или поврежденных файлов

    Как получить IP-адрес клиента SSH с помощью сценария оболочки?

    Как перенаправить stdout и stdin в telnet?

    Linux и Unix - лучшая ОС в мире.