1

Я нашел плагин 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

2 ответа2

1

Этот сценарий должен делать это, в любом случае, с некоторыми допущениями. Например, он сломается, если атрибуты в теге 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 it и вызов с именем входного файла в качестве аргумента. Как таковой, он создаст свой выходной файл в текущем каталоге, поэтому будьте осторожны.

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

1

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

#!/usr/bin/gawk -f

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .