我找到了一个 Tiddlywiki 插件,可以将所有 tiddlers 导出到一个纯文本文件中,但我想使用我的 Tiddlywiki 文件并将各个 tiddlers 导出到单独的文本文件中(稍后迁移到 notes.vim)。有没有一种使用 bash 或 vim 的简单方法可以做到这一点?
tiddlywiki文件包含格式/语法类似:
<div title="Anthony Wallace" creator="Jon" modifier="Jon" created="201104020927" changecount="1" tags="anthropologists, mythology">
我想解析 div 内容并创建一个名为“Anthony Wallace”的文件,其中前两行如下:
安东尼·华莱士
@人类学家 @神话
答案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
并以输入文件名作为参数进行调用。事实上,它将在当前目录中创建其输出文件,因此请小心。
如果您的输入文件以目录树的形式构造,您可能必须使用 shell 通配符、循环或实用程序来找到正确的命令行find
。
答案2
注意 gensub 是 awk 的 gawk 扩展,因此第一行实际上应该是
#!/usr/bin/gawk -f
在某些版本的 TiddlyWiki 中,这些行如下所示(第 4 行):
/<div title=".*" modifier=".*"/
我想将所有 tiddlers 提取到一个 html 文件中,因此我删除了所有到“名称”文件的重定向,并添加了以下顶部和尾部代码:
BEGIN { print("<html>") }
END { print("</html>") }
代码真的很有用,展示了 awk 的强大功能!非常感谢,Peter