Как мне разобрать Tiddlywiki в кучу простых текстовых файлов?

1462
Jonathan

Я нашел плагин Tiddlywiki для экспорта всех тиддлеров в один простой текстовый файл, но я хочу взять свой файл Tiddlywiki и экспортировать отдельные тиддлеры в отдельные текстовые файлы (позже для переноса в notes.vim). Есть ли простой способ сделать это с помощью bash или vim?

Файл Tiddlywiki содержит форматирование / синтаксис, подобный этому:

<div title="Anthony Wallace" creator="Jon" modifier="Jon" created="201104020927" changecount="1" tags="anthropologists, mythology">

и я хочу проанализировать содержимое div и создать файл с именем "Энтони Уоллес" с первыми двумя строками:

Энтони Уолас

@anthropologists @mythology

1

2 ответа на вопрос

1
peth

Этот сценарий должен делать это, в любом случае, с некоторыми допущениями. Например, он сломается, если атрибуты в divтеге содержит скобку закрывания ( >), если порядок titleи creatorатрибуты изменений, или если divтег охватывает несколько строк.

#!/usr/bin/awk -f  # treat the opening tag line here /<div title=".*" creator=".*"/ { indiv = 1 # inside div from here on name = gensub(/.* title="([^"]+)".*/, "\\1", "") # extract name tagsattr = gensub(/.* tags="([^"]+)".*/, "\\1", "") # extract tags string split(tagsattr, tags, /, /) # split tags into array  print(name) > name # print name into file "name" for(tag in tags) printf("@%s ", tags[tag]) >> name # print tags with "@" prefix printf("\n\n") >> name # two newlines sub(/.*<div [^>]+>/, "") # remove the tag so the rest # of the line can be printed }  # treat closing line indiv == 1 && /<\/div>/ { sub(/<\/div>.*/, "") # remove tag so the rest print >> name # can be printed indiv = 0 # outside div from here on }  # print all other lines inside of div indiv == 1 { print >> name } 

chmod +xэто и вызов с именем входного файла в качестве аргумента. Как таковой, он создаст свой выходной файл в текущем каталоге, поэтому будьте осторожны.

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

1
peterthevicar

Примечание: gensub - это расширение gawk для awk, поэтому первая строка должна быть

#!/usr/bin/gawk -f 

В некоторых версиях TiddlyWiki строки выглядят так (строка 4):

/<div title=".*" modifier=".*"/ 

Я хотел извлечь все тиддлеры в один HTML-файл, поэтому я удалил все перенаправления в файл 'name' и добавил следующий верхний и хвостовой код:

BEGIN { print("<html>") } END { print("</html>") } 

Действительно полезный код, показывает силу awk! Большое спасибо, Питер