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

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

INPUT:

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

OUTPUT:

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

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

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

1 Ответ

0 голосов
/ 04 мая 2020

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

FIRST - сделать несколько проходов (Нил Фейман):

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

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

Дает нам

• Апрель 2020 года (отдельные разговоры будут добавлены до конца месяца.) [Воспроизвести аудио] 25 Быть ответственным [воспроизвести аудио] 24 В стране неправильного представления [воспроизвести аудио] 05 Владельцы наших действий [воспроизвести аудио] 04 Богатство и сила [воспроизвести аудио] 03 Умелое сердце [воспроизвести аудио] 02 Остановись и подумай [воспроизведи аудио] 01 A Mirror for the Mind • Март 2020 Полный месяц zip [play audio] 31 Worry [play audio] 30 Поместите сердце другого человека в свое ...

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

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

Дает нам:

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

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

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

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

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

Что делает скрипт:

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

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

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

на

$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";
    }
}
...