迁移cnblog博客


title: 迁移cnblog博客
date: 2018-03-18
categories: cnblogs
tags: life


写博客最怕就是这种迁来迁去的,太麻烦了
还好老早就使用markdown编写,纯文本直接复制就可以了,格式不会差到哪去的,最低的保障有了可是还是很麻烦

在cnblogs后台控制面板找到 博客备份, 这个可以将所有博客导出到一个xml文件中,确实方便了很多,感谢cnblogs
后面就是各自用办法解析xml的问题了

我这里直接使用bash来解析这个xml文件
代码如下

#!/bin/bash
#
set -e

for num in {1..60}
do
  title=$(echo "cat /rss/channel/item[${num}]/title/text()" |xmllint --shell cnblogs.xml | sed '1d;$d')
  pubDate=$(echo "cat /rss/channel/item[${num}]/pubDate/text()"|xmllint --shell cnblogs.xml | sed '1d;$d')
  datestr=$(date -d "$pubDate"  +"%Y-%m-%d %T")
  description=$(echo "cat /rss/channel/item[${num}]/description/text()" |xmllint --shell cnblogs.xml | sed -e '1d;$d' -e '2 s/<!\[CDATA\[//' | sed -e '$s/]]>$//')

  echo "---" >                   "${title}".md
  echo "title: $title" >>        "${title}".md
  echo "date: $datestr" >>       "${title}".md
  echo "categories: cnblogs" >>  "${title}".md
  echo "tags: linux" >>          "${title}".md
  echo "---" >>                  "${title}".md
  echo  >>                       "${title}".md
  echo "$description" >>         "${title}".md
done

这里几个说明:

  1. 我之前看了博客总数是60,这里就没有从xml文件里面获取总数了
  2. 新的blog也是使用markdown,不过头部需要注明一些扩展元素(title,date,categories,tags等),这里直接写入这些信息
  3. 解析xml比较麻烦的就是正文内容了,之前的解析始终有xml的cdata字符(用--nocdata转换了特殊字符问题更大),这里用两条sed语句去除
  4. 使用的解析xml的工具是xmllint,centos(各个发行版基本都提供对应命令)可以使用yum provides xmllint查看属于哪个包 (Repo: base, Name: libxml2)
  5. 其实这里sed还是很有趣的,学海无涯沧海一粟

最后按每条博客的标题生成一个markdown文件

附注:
毕竟不是python这种可以完美处理xml,可能会对解析xml的命令感到不解
这里我主要参考:https://unix.stackexchange.com/questions/83385/parse-xml-to-get-node-value-in-bash-script
也可以参考man手册,我这里之前用--xpath提取标题,导致编码有问题,使用这种方式可以正常处理

我把测试文件附加上

<?xml version="1.0"?>
<config>
    <global>
        <install>
            <date><![CDATA[Tue, 11 Dec 2012 12:31:25 +0000]]></date>
        </install>
        <crypt>
            <key><![CDATA[70e75d7969b900b696785f2f81ecb430]]></key>
        </crypt>
        <disable_local_modules>false</disable_local_modules>
        <resources>
            <db>
                <table_prefix><![CDATA[]]></table_prefix>
            </db>
            <default_setup>
                <connection>
                    <host><![CDATA[localhost]]></host>
                    <username><![CDATA[root]]></username>
                    <password><![CDATA[pass123]]></password>
                    <dbname><![CDATA[testdb]]></dbname>
                    <initStatements><![CDATA[SET NAMES utf8]]></initStatements>
                    <model><![CDATA[mysql4]]></model>
                    <type><![CDATA[pdo_mysql]]></type>
                    <pdoType><![CDATA[]]></pdoType>
                    <active>1</active>
                </connection>
            </default_setup>
        </resources>
        <session_save><![CDATA[files]]></session_save>
    </global>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <frontName><![CDATA[admin]]></frontName>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

参考使用方式

{
# the given XML is in file.xml
host="$(echo "cat /config/global/resources/default_setup/connection/host/text()" | xmllint --nocdata --shell file.xml | sed '1d;$d')"
username="$(echo "cat /config/global/resources/default_setup/connection/username/text()" | xmllint --nocdata --shell file.xml | sed '1d;$d')"
password="$(echo "cat /config/global/resources/default_setup/connection/password/text()" | xmllint --nocdata --shell file.xml | sed '1d;$d')"
dbname="$(echo "cat /config/global/resources/default_setup/connection/dbname/text()" | xmllint --nocdata --shell file.xml | sed '1d;$d')"
printf '%s\n' "host: $host" "username: $username" "password: $password" "dbname: $dbname"
}

# output
# host: localhost
# username: root
# password: pass123
# dbname: testdb
posted @ 2018-03-18 21:25  mikeguan  阅读(251)  评论(0编辑  收藏  举报