Sed и импорт старых постов

Уже писал о том, как сконвертировать блог из Wordpress в markdown-файлы. Теперь, год спустя пришло время разобрать гору файлов и перенести сюда. Попытался переносить их вручную, но выяснилось, что точная подгонка старых постов под формат новых занимает слишком много времени даже без учета затрат на правку текста. Так что, понаблюдав за процессом, был рожден вот такой скрипт, реализающий кучу замен, на которые ручками уходило большая часть времени.

Ниже в комментариях подробные описания процесса, а пока несколько выстраданных наблюдений о bash и о sed, с которым так плотно я сталкиваюсь впервые.

Навыки bash уже давно утеряны, да и скрипт «одноразовый», так что если есть варианты оптимизации — welcome.

  1. Стандартный #!/bin/sh, который на самом деле dash, ломал разбор имени файла "${i##*/}", так что пришлось переключиться на /bin/bash.
  2. /bin/bash поломал работу echo "\n\nP.S." — переносы строки не раскрывались, так что пришось echo заменить на printf.
  3. Передача целевой директории через $1 приводила к тому, что обрабатывался только первый файл, так что прилось захардкодить files=./md_pure/*.md.
  4. Sed плохо понимает ![], так что регулярка заработала только после экранирования каждого символа, после чего превратилась в адовоую кашу — "s/) \[\!\[\]/) \n\n\[\!\[alt\]/".
  5. Оказалось, что можно вполне неплохо решить задачу удаления ненужных переносов строк внутри абзацев, правда решение мне слабопонятно и выглядит как атомная война — ':begin;$!N;s/([а-яА-ЯёЁ0-9a-zA-Z,-])\n/\1 /;tbegin;P;D'. Единственное, что я понимаю в этом монстре — список симовлов, после которых нужно удалять переносы строки.
  6. Ключ -i чертовски важен, так как реализует in place редактирование файла.

#!/bin/bash 

files=./md_pure/*.md 

find $files | xargs -i@ sed -i "s/)   \[\!\[\]/)   \n\n\[\!\[alt\]/" @ # перенос слепленных тегов картинок на следующую строку
find $files | xargs -i@ sed -i 's/  \[\!\[\]/\[\!\[alt\]/g' @ # удаление двух пробелов перед тегом с картинкой
find $files | xargs -i@ sed -i 's/!\[]/\![alt]/g' @ # добавление alt-текста в тег с картинкой (Pelican ругается)

find $files | xargs -i@ sed -i 's/Author://g' @ # удаление метатега автора (всегда пуст)
find $files | xargs -i@ sed -i ':begin;$!N;s/\([а-яА-ЯёЁ0-9a-zA-Z,-]\)\n/\1 /;tbegin;P;D' @  # удаление переносов строки внутри абзацев
find $files | xargs -i@ sed -i 's/ Date:/ \nDate:/g' @  # перенос метатега даты на следующую строку
find $files | xargs -i@ sed -i '/Date/ s/[0-9][0-9]:[0-9][0-9]//g' @  # удаление времени из даты
find $files | xargs -i@ sed -i '/Date:/a Slug: SLUGTOKEN\nTags: old post, 20\n' @  # добавление новых метатегов

find $files | xargs -i@ sed -i 's/ > //g' @ # удаление символов цитирования из середины абзаца
find $files | xargs -i@ sed -i 's/http:\/\/andrewkiselev.com//g' @ # удаление абсолютных ссылок
find $files | xargs -i@ sed -i 's/andrewkiselev.com//g' @ # см. выше
find $files | xargs -i@ sed -i 's/{style="text-align: justify;"}//g' @ # удаление паразитных остатков html

find $files | xargs -i@ sed -i 's/s400/s800/g' @ # выравнивание ширины картинов с гугл фоток
find $files | xargs -i@ sed -i 's/s640/s800/g' @ # см. выше
find $files | xargs -i@ sed -i 's/s912/s800/g' @ # см. выше

find $files | xargs -i@ sed -i 's/ - / — /g' @ # замена дефисов на тире
find $files | xargs -i@ sed -i 's/ -- / — /g' @ # замена псевдо-тире на тире
find $files | xargs -i@ sed -i 's/-   /+  /g' @ # замена стандарной нотации списков 

find $files | xargs -i@ sed -i 's/ "/ «/g' @ # замена передней кавычки
find $files | xargs -i@ sed -i 's/" /» /g' @ # замена задней кавычки
find $files | xargs -i@ sed -i 's/"./» /g' @ # см. выше
find $files | xargs -i@ sed -i 's/",/» /g' @ # см. выше

find $files | xargs -i@ sed -i 's/^[ ]*\[/\[/g' @ # удаление всех пробелов в начале строки перед тегами

find $files | xargs -i@ sed -i 's/-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------/ /g' @
find $files | xargs -i@ sed -i 's/----//g' @
find $files | xargs -i@ sed -i 's/-----//g' @
find $files | xargs -i@ sed -i 's/------//g' @
find $files | xargs -i@ sed -i 's/-------//g' @
find $files | xargs -i@ sed -i 's/--------//g' @
find $files | xargs -i@ sed -i 's/---------//g' @
find $files | xargs -i@ sed -i 's/----------//g' @
find $files | xargs -i@ sed -i 's/-----------//g' @   
find $files | xargs -i@ sed -i 's/------------//g' @


for i in $files
do 
    echo -ne "$i\t\t\t\t"
    printf "\n\nP.S. Перепубликовано 2016-01-11   " >> $i  # добавление примечания к каждому файлу

    slug="${i##*/}"     # извлечение имени файла из пути
    slug="${slug/.md/}" # удаление расширения
    echo $slug 

    sed -i "s/SLUGTOKEN/${slug}/g" $i  # вставка имени файла как адреса страницы 
done

echo 'DONE'