Регулярное выражение, повторение захваченного текста в результат (BBEdit)

Мудрые, я пытаюсь распространить (суффикс) начальный месяц-год, предшествующий списку элементов дней месяца. Я думал, что есть способ «зафиксировать» значение, но я не могу понять, как REGEXP будет использовать его, циклически перебирая строки ввода.

ВХОД:

December 2015
    25 Christmas
    01 My Birthday
January 2015
    03 My entry for the 3rd
etc.

ВЫВОД:

2015-December-25 Christmas
2015-December-01 My Birthday
2015-January-03 My entry...

Я начал с: \ W * (январь | февраль | март | апрель | май | июнь | июль | август | сентябрь | октябрь | ноябрь | декабрь) (\ d \ d \ d \ d) \ n

BBEdit в Mac OSX с использованием выражений GREP.


person Peter Kaufman    schedule 30.04.2020    source источник
comment
Это зависит от того, какой инструмент вы используете. Если это текстовый редактор, это все еще возможно, но для этого потребуется несколько шагов.   -  person Wiktor Stribiżew    schedule 30.04.2020
comment
На каком языке ты говоришь?   -  person Tim Biegeleisen    schedule 30.04.2020
comment
Прости. Я использую регулярные выражения в редакторе Bare Bones Editor в Mac OSX. (BBEdit). ТАКЖЕ, я переставил данные - это MONTH ‹SPACE› YYYY.   -  person Peter Kaufman    schedule 30.04.2020


Ответы (1)


Я получил два ответа. Оба отлично работают.

ПЕРВЫЙ - сделайте несколько проходов (Нил Файман):

Во-первых, добавьте какой-нибудь символ, который больше нигде в файле не встречается, в начало каждой строки месяца. Я использую пулю здесь:

Find: ^\s*[a-z]+ \d{4}$
Replace: •&
Replace all

Дает нам

• Апрель 2020 (на некоторое время до конца месяца будут добавлены индивидуальные выступления.) [Включить аудио] 25 Быть ответственным [включить аудио] 24 В стране неправильного взгляда [включить аудио] 05 Владельцы наших действий [включить аудио ] 04 Богатство и сила [воспроизведение аудио] 03 Умелое сердце [воспроизведение аудио] 02 Стой и размышление [воспроизведение аудио] 01 Зеркало для разума • Март 2020 г. Архив на весь месяц [воспроизведение аудио] 31 Беспокойство [воспроизведение аудио] 30 Положите Сердце другого человека в твоем ...

Затем напишите шаблон для замены первой (если есть) строки [play audio] в каждом месяце:

Find: (?s)(^•\s*([a-z]+) (\d{4})\n[^•]*?)(\[play audio\] (\d\d))
Replace: \1\3-\2-\5
Replace all

Дает нам:

• Апрель 2020 г. (индивидуальные выступления будут добавлены на некоторое время до конца месяца.) 2020-апрель-25 Быть ответственным [включить аудио] 24 В стране неправильного взгляда [включить аудио] 05 Владельцы наших действий [включить аудио ] 04 Богатство и сила [включить аудио] 03 Умелое сердце [включить аудио] 02 Стой и подумать [включить аудио] 01 Зеркало для разума • Март 2020 г. Архив за весь месяц 2020-31 марта-31 Беспокойство [включить аудио] 30 Поместите Сердце другого человека в твоем [включить аудио] 29 Защита через внимательность ...

Теперь просто продолжайте нажимать Cmd-Shift- = несколько раз, каждый раз заменяя первую необработанную строку каждого месяца, пока она не выйдет из строя. (Если у вас не более сотни строк [воспроизведение аудио] в месяц, это займет не более пары минут, т. Е. Гораздо меньше времени, чем потребуется, чтобы найти более разумное решение. Если у вас есть тысяча строк в в месяц вам понадобится другое решение.

Наконец, последний поиск и замена удалит все маркеры, которые вы вставили на первом шаге.

ВТОРОЙ - создание Perl-скрипта для анализа строк (Мэтью Фишер)

Вы можете сделать это с помощью текстового фильтра. Сохраните следующий код в файле под названием «date_prefixer.pl», поместите его в папку текстовых фильтров, затем вернитесь к своему файлу и выберите «Текст» -> «Применить текстовый фильтр - префикс даты» в строке меню.

Что делает сценарий:

1) Перебирает каждую строку в вашем выборе (если он у вас есть) или весь файл (если у вас его нет). 2) Если строка начинается со слова, за которым следует пробел, за которым следует 4-значное число, значение переменной «$ date» устанавливается равным числу, плюс тире, плюс слово плюс еще одно тире. 3) Если строка начинается с «[play audio]», за которым следует пробел, за которым следует двузначное число, текст «[play audio]» заменяется текущим значением «$ date», тогда строка печатается. 4) Если ни одно совпадение не совпадает, ничего не делается и сценарий переходит к следующей строке.

Я установил сценарий, чтобы он делал именно то, что говорит ваш пример. Если вы хотите, чтобы для месяца использовалось соответствующее двузначное число, измените эту строку:

$date = $2 . "-$1-";

to

$date = $2 . "-$month{$1}-";


#!/usr/bin/perl

$month{"January"}   = "01";
$month{"February"}  = "02";
$month{"March"}     = "03";
$month{"April"}     = "04";
$month{"May"}       = "05";
$month{"June"}      = "06";
$month{"July"}      = "07";
$month{"August"}    = "08";
$month{"September"} = "09";
$month{"October"}   = "10";
$month{"November"}  = "11";
$month{"December"}  = "12";

while (<>) {
    if ( $_ =~ /^([^ ]+) ([0-9]{4})/ ) {
        $date = $2 . "-$1-";
    }
    elsif ( $_ =~ /^\[Play Audio\] ([0-9]{2}.+)/i ) {
        print $date . $1 . "\n";
    }
}
person Peter Kaufman    schedule 04.05.2020