Regular-Expression
基於正則表達式拆分文本文件
我有一個文本文件,我想根據易經的 64 個卦分成 64 個不等的部分。由於每個六角星的段落都以一些數字、一個句點和兩個換行符開頭,因此正則表達式應該很容易編寫。
但是我如何根據這個正則表達式將文本文件實際拆分為 64 個新文件?這似乎更像是一項任務
perl
。但也許有一種更明顯的方式,我完全錯過了。
這將是
csplit
除了正則表達式必須是單行之外。這也sed
很困難;我會選擇 Perl 或 Python。你可以看看是否
csplit foo.txt '/^[0-9][0-9]*\.$/' '{64}'
足以滿足您的目的。(
csplit
需要 POSIX BRE,因此它不能使用\d
or+
等。)
我認為最好的方法是
awk
andgawk
。awk
awk -F "([.] )|( / )" '/^[0-9]{1,3}[.]/{x="F"$1"("$2").txt";}{print >x;}' I_Ching_Wilhelm_Translation.txt
-F
將為每一行指定欄位分隔符。它是一個正則表達式,這裡我們使用多個分隔符:". "
和" / "
. 因此,一行 like1. Ch'ien / The Creative
將被分成 3 個欄位:1
Ch'ien
和The Creative
. 稍後我們可以使用 來引用這些欄位$n
。$0
是整條線。然後我們告訴 awk 將這些行與 pattern 匹配。
^[0-9]{1,3}[.]
如果匹配,我們將值分配給x
。值 x 將用作"F"$1"("$2").txt"
所以該行1. Ch'ien / The Creative
給出一個文件名F1(Ch'ien).txt
呆呆
在 gawk 中,我們還可以訪問擷取的組。所以我們可以將命令簡化為:
gawk 'match($0, /^([0-9]{1,3})[.] (.*) \/ (.*)$/, ary){x="F"ary[1]"("ary[2]")";}{print >x;}' I_Ching_Wilhelm_Translation.txt
在這裡,我們使用
match
擷取組並將它們放入變數列表中ary
。$0
是整條線。ary[0]
一切都匹配。ary[1...n]
是每個組。perl
我們也可以用 perl 來做:
perl -ne 'if(/^([0-9]{1,3})[.] (.*) \/ (.*)$/) {close F; open F, ">", sprintf("F$1($2).txt");} print F' I_Ching_Wilhelm_Translation.txt
結果:
> ls F* F10(Lü).txt F22(Pi).txt F34(Ta Chuang).txt F46(Shêng).txt F58(Tui).txt F11(T'ai).txt F23(Po).txt F35(Chin).txt F47(K'un).txt F59(Huan).txt F12(P'i).txt F24(Fu).txt F36(Ming I).txt F48(Ching).txt F5(Hsü).txt F13(T'ung Jên).txt F25(Wu Wang).txt F37(Chia Jên).txt F49(Ko).txt F60(Chieh).txt F14(Ta Yu).txt F26(Ta Ch'u).txt F38(K'uei).txt F4(Mêng).txt F61(Chung Fu).txt F15(Ch'ien).txt F27(I).txt F39(Chien).txt F50(Ting).txt F62(Hsiao Kuo).txt F16(Yü).txt F28(Ta Kuo).txt F3(Chun).txt F51(Chên).txt F63(Chi Chi).txt F17(Sui).txt F29(K'an).txt F40(Hsieh).txt F52(Kên).txt F64(Wei Chi).txt F18(Ku).txt F2(K'un).txt F41(Sun).txt F53(Chien).txt F6(Sung).txt F19(Lin).txt F30(Li).txt F42(I).txt F54(Kuei Mei).txt F7(Shih).txt F1(Ch'ien).txt F31(Hsien).txt F43(Kuai).txt F55(Fêng).txt F8(Pi).txt F20(Kuan).txt F32(Hêng).txt F44(Kou).txt F56(Lü).txt F9(Hsiao Ch'u).txt F21(Shih Ho).txt F33(TUN).txt F45(Ts'ui).txt F57(Sun).txt
如何獲取範例文件:
curl http://www2.unipr.it/~deyoung/I_Ching_Wilhelm_Translation.html|html2text -o I_Ching_Wilhelm_Translation.plain sed 's|^[[:blank:]]*||g' I_Ching_Wilhelm_Translation.plain > I_Ching_Wilhelm_Translation.txt