背景
現(xiàn)有一 Markdown 文件心铃,其中有 50 個小組塊钟病,組塊之間以二級標題區(qū)分。每個二級標題下有 1 張圖片漾狼,然后是文字。
以下是文檔中部分內容示例:
## 1. 小明
址)
今天小明去打羽毛球饥臂。
## 2. 小紅
址)
今天小紅去逛街逊躁。
現(xiàn)在希望:
- 把這 50 個組塊單獨切割出來
- 每個組塊均轉換為 doc 文件
- 文件名為小標題名(只有中文,不含數(shù)字序號)
- 每個小組塊文件中隅熙,以小標題為內文標題(只有中文稽煤,不含數(shù)字序號)
問:
如何批量完成該工作?
任務拆分
- 將 1 個 md 文件批量切割 md 文件 為 50 個 md 文件
- 切割的同時囚戚,將小標題作為文件名取出并直接為每個組塊文件命名
- 將 50 個 md 文件批量轉換成 50 個 doc 文件
工具準備
- python:撰寫批量切割的 python 腳本
- pandoc:用于格式轉換
- bash:通過 shell 腳本實現(xiàn)批量的格式轉換酵熙;有可能需要用上批量重命名的命令
rename
來進行邊角修改
任務 1: 批量切割文檔
首先思考:
如果是手動切割,過程是怎樣的驰坊?
顯然我們是以二級標題為切割標志的匾二。而二級標題的代碼是 ##
,會不會在文中其他地方出現(xiàn)呢拳芙?
進一步觀察與思考會發(fā)現(xiàn):切割標志其實不是 ##
察藐,而是 \n##
——也就是說,段落中或者網(wǎng)址中出現(xiàn)的 ##
都不是二級標題的代碼态鳖,只有換行符 \n
與 ##
連續(xù)出現(xiàn)時转培,##
才是二級標題代碼。因此我們確定了切割標志為:(字符串)\n##
python 中字符串的 str.split(sep, maxsplit)
方法可接受 2 個參數(shù)[1]:
- 第 1 個參數(shù) sep 表示分割標志(這里是
\n##
) - 第 2 個參數(shù) maxsplit 表示最多分割幾次(由于是 50 份浆竭,故應該切割 49 次)
所以將讀入的全文以小標題為界分割為 50 份字符串的關鍵代碼是:
# 已將全文讀入 finContent 中
sp50 = finContent.split("\n##", 49)
任務 2:批量將已切割好的字符串導出到 50 個 md 文件中浸须,并以各小標題為各文件命名
批量導出到 50 個 md 文件中并不難惨寿,如果沒有上述命名需求,那么直接一個迭代 50 次的 for 循環(huán)即可解決該問題删窒。
問題在于:
如何取得各小標題名并為新生成的文件命名裂垦?
觀察每個小組塊,發(fā)現(xiàn)規(guī)律:
- 每個二級標題中都有英文句號「.」肌索,在「.」后的部分蕉拢,除去空格,即為小標題所有文字诚亚,這意味著:只要取得小標題所在行的內容晕换,就可以用
str.split()
方法取得小標題對應文字 - 二級標題下即為圖片代碼,也就是說對這 50 個字符串而言站宗,每個字符串可以
\n\n[0]).split('.'))[1]).split(' '))[1]
綜合前 2 項任務,該腳本代碼如下(同時放在 GitHub 庫中):
#coding: utf-8
originPath = "/home/sushangjun/Documents/"
srcPath = originPath + "Top50Bussiness.txt"
tarPath = originPath + "output50/"
fin = open(srcPath, 'r')
finContent = fin.read()
sp50 = finContent.split("\n##", 49)
for iStr in sp50:
index = ((((iStr.split("\n\n[0]).split('.'))[1]).split(' '))[1]
fout = open(tarPath + "{}.md".format(index), 'w')
fout.write("## " + index + "\n\n)[1])
fout.close()
fin.close()
在命令行中執(zhí)行該腳本梢灭,即可完成批量切割任務夷家。
任務 3: 批量轉換格式
這里需要使用 Pandoc[2],Debian 系 Linux 只要使用 apt-get 安裝即可:
$ sudo apt-get install pandoc
完成后敏释,輸入 pandoc --version
查看是否安裝成功库快。
若安裝成功,只要下述命令钥顽,即可將 a.md
轉換為 a.doc
:
$ pandoc a.md -o a.doc -c Github.css
但是這只能實現(xiàn)單文件的格式轉換义屏,若需要多文件的格式轉換,顯然需要批處理耳鸯。對 *nix 稍有了解的人很容易聯(lián)想到使用 bash shell 來解決這個問題:
- 讀取目錄下的文件列表
- 對讀取的每個文件名執(zhí)行上述 pandoc 命令
由于事情緊急湿蛔,因此查找網(wǎng)絡資料后,在命令行中輸入下述命令县爬,完成文件格式批量轉換:[3]
注:下述操作均默認在 50 個 md 文件所在目錄下進行
$ ls > aa.md
$ cat aa.md |while read line
> do
> pandoc $line -o $line.doc -c Github.css
> done
這樣基本完成了批量格式轉換問題阳啥。但有 1 點不美:那就是在此操作下,得到的文件后綴是 .md.doc
而非 .doc
财喳。如何解決這個問題呢察迟?最后我們就使用 rename
方法搭配簡單的正則表達式,完成該任務:[4]
rename 's/\.md.doc/\.doc/' *
相關代碼也已經(jīng)寫成 shell script 形式上傳到 GitHub 庫中.