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

#regex #bash

#регулярное выражение #bash

Вопрос:

У меня есть один длинный текстовый файл со множеством статей, которые я хочу разделить на отдельные текстовые файлы (одна статья = один файл), чтобы я мог использовать их в CMS, которая работает с текстовыми файлами. файлы.

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

 ----
Content: First article text
----
Slug: first-article
----

####

----
Content: Second article text
----
Slug: second-article
----

####
 

Я хочу сопоставлять каждую статью с помощью регулярного выражения и создавать новые текстовые файлы для каждого совпадения.
Как бы это сделать? Я уже разобрался с регулярным выражением с помощью Sublime ( (?s)####nn. ?nn ), но как мне вывести совпадение в новый текстовый файл? Я предполагаю, что должен быть способ с помощью сценариев bash (который я никогда раньше не использовал)?

Редактировать: желательно, чтобы каждый текстовый файл был назван в честь заголовка статьи.

Любая помощь очень ценится!

Комментарии:

1. Как вы хотите назвать файлы?

2. Хороший момент. Каждая статья включает в себя пули, так что я думаю, это было бы полезно. Я отредактирую свой пост, чтобы сделать его более понятным.

Ответ №1:

Использование GNU awk

 awk 'BEGIN { 
             RS="####" # set record separator to ####
           } 
           { 
             slug=""; # initialise a variable for later
             match($0,/Slug:.*[[:space:]]/); # Match for the slurp text
             slug=substr($0,RSTART 6,RLENGTH-8); Extract the slup text after ":"
             if (slug!="") { 
                      print $0 > slug # If slug is set, print the line to a file named by contents of slug 
             }  
            }' file
 

Один вкладыш:

 awk 'BEGIN { RS="####" } { slug="";match($0,/Slug:.*[[:space:]]/);slug=substr($0,RSTART 6,RLENGTH-8);if (slug!="") { print $0 > slug }  }'
 

Комментарии:

1. Возможно, вы захотите добавить close(slug) туда, чтобы все было аккуратно.