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

Вместо того, чтобы настраивать приложения для предотвращения синий на черном я рекомендую настроить терминал для создания синего более видимым. Большинство эмуляторов терминала имеет установку для этого. В xterm существует X ресурсов:

XTerm.VT100.color4: CornflowerBlue

В других эмуляторах терминала посмотрите в конфигурационном файле или диалоговом окне для настроек цветов или тем.

Существует последовательность общего контроля для установки оттенка, связанного с номером цвета из приложения: OSC 4 ; c ; spec BEL где OSC ESC ], c номер цвета и spec цветная спецификация, такая как #RGB.

printf %b '\e]4;4;#6495ed\a'  # set the blue shade to CornflowerBlue

Изменение приложением является только эффективным до следующего терминального сброса. Если Вы используете этот метод (только рекомендовал, если Ваш терминал испытывает недостаток в механизме конфигурации), чтобы делать изменение эффективно персистентным, добавить escape-последовательность настройки цветов к строке сброса Вашего терминала (termcap: r1 строка; terminfo: rs1 строка).

См. также Переопределение оттенка отображенного цвета, я могу выбрать терминальные цвета своей локальной машины для использования тех из машины I ssh в?.

16
30.05.2018, 22:23
3 ответа

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

Вы видели если

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

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

23
27.01.2020, 19:48
  • 1
    Спасибо, @geekosaur. Это работало отлично, хотя я должен был изменить его на {63}. –  ixtmixilix 26.06.2011, 22:47
  • 2
    Так, '\.' не будет работать также? –  Vanuan 03.02.2016, 12:18

С GNU coreutils, можно использовать csplit повредить файл в regexp-разграниченные части, как показано 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
}
3
27.01.2020, 19:48
  • 1
    Это работает в принципе, но заголовок раздела фактических данных веб-страницы как не представлен regex (аналогично с ответом geekosaur). Продвижение nunber. сопровождается текстом, которые содержат наклонную черту /. Я вполне уверен two newlines упомянутые ixtmixilix являются 2 пустыми строками, которые предшествуют числовому идентификатору и более конкретно определили бы заголовок, но поскольку данные по веб-странице только соответствуют /^[0-9]+\. в заголовках раздела нет никакой потребности обслужить их (в данном случае).спасибо; специально для введения к getline.. PS. может, в то время как быть то, если? –  Peter.O 27.06.2011, 16:58
  • 2
    @fred geekosaur и я прошли мимо описания в вопросе, не по условию на веб-сайте. Расположение будет зависеть от механизма визуализации HTML, используемого для преобразования в текст; часть, откуда это представляется веб-страницы, на самом деле не важна вопросу. ||| while есть ли в случае, если вход содержит 1.\n2.\n\n (где \n новые строки): 2. должен быть распознан в строке заголовка. Это не собирается происходить здесь, но я поддерживаю его в своем коде, чтобы сделать его более общим (и соответствовать спецификации в вопросе более строго). –  Gilles 'SO- stop being evil' 27.06.2011, 17:20

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

авк

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 поля:1Ch'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 -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
5
27.01.2020, 19:48

Теги

Похожие вопросы