Regular-Expression

基於正則表達式拆分文本文件

  • June 2, 2020

我有一個文本文件,我想根據易經的 64 個卦分成 64 個不等的部分。由於每個六角星的段落都以一些數字、一個句點和兩個換行符開頭,因此正則表達式應該很容易編寫。

但是我如何根據這個正則表達式將文本文件實際拆分為 64 個新文件?這似乎更像是一項任務perl。但也許有一種更明顯的方式,我完全錯過了。

這將是csplit除了正則表達式必須是單行之外。這也sed很困難;我會選擇 Perl 或 Python。

你可以看看是否

csplit foo.txt '/^[0-9][0-9]*\.$/' '{64}'

足以滿足您的目的。(csplit需要 POSIX BRE,因此它不能使用\dor+等​​。)

我認為最好的方法是awkand gawk

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'ienThe Creative. 稍後我們可以使用 來引用這些欄位$n$0是整條線。

然後我們告訴 awk 將這些行與 pattern 匹配。^[0-9]{1,3}[.]如果匹配,我們將值分配給x。值 x 將用作print操作的文件名。在這個例子中,我們使用"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

引用自:https://unix.stackexchange.com/questions/15662