#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)
туда, чтобы все было аккуратно.