基于正则表达式拆分文本文件

ixt*_*lix 22 regular-expression split

我有一个文本文件,我想根据易经的 64 卦将其分成 64 个不相等的部分。由于每个卦的段落都以一些数字、一个句点和两个换行符开头,因此正则表达式应该很容易编写。

但是如何根据这个正则表达式将文本文件实际拆分为 64 个新文件?似乎更像是perl. 但也许有一种更明显的方式让我完全失踪。

gee*_*aur 28

这将是csplit除了正则表达式必须是一个单行。这也sed很困难;我会使用 Perl 或 Python。

你可以看看

csplit foo.txt '/^[0-9][0-9]*\.$/' '{64}'
Run Code Online (Sandbox Code Playgroud)

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


Wan*_*ang 7

\n我认为最好的方法是awkgawk

\n\n

awk

\n\n
awk -F "([.] )|( / )" \'/^[0-9]{1,3}[.]/{x="F"$1"("$2").txt";}{print >x;}\' I_Ching_Wilhelm_Translation.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

-F将为每行指定字段分隔符。它是一个正则表达式,这里我们使用多个分隔符:". "" / "。因此,像这样的行将1. Ch\'ien / The Creative被分为 3 个字段:1 Ch\'ienThe Creative。稍后我们可以用 来引用这些字段$n$0是整条线。

\n\n

然后我们告诉 awk 将行与模式匹配 ^[0-9]{1,3}[.]如果有匹配,我们然后将值分配给x。值 x 将用作操作的文件名print。在此示例中,我们使用"F"$1"("$2").txt"so 该行1. Ch\'ien / The Creative给出文件名F1(Ch\'ien).txt

\n\n

呆呆地

\n\n

在gawk中,我们还可以访问捕获的组。因此我们可以将命令简化为:\n

\n\n
gawk \'match($0, /^([0-9]{1,3})[.] (.*) \\/ (.*)$/, ary){x="F"ary[1]"("ary[2]")";}{print >x;}\' I_Ching_Wilhelm_Translation.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里我们使用match捕获组并将它们放入变量列表中ary$0是整条线。ary[0]一切都匹配。ary[1...n]是每组。

\n\n

珀尔

\n\n

我们也可以使用 perl 来完成:\n

\n\n
perl -ne \'if(/^([0-9]{1,3})[.] (.*) \\/ (.*)$/) {close F; open F, ">", sprintf("F$1($2).txt");} print F\' I_Ching_Wilhelm_Translation.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:\n

\n\n
> ls F*\nF10(L\xc3\xbc).txt         F22(Pi).txt       F34(Ta Chuang).txt  F46(Sh\xc3\xaang).txt     F58(Tui).txt\nF11(T\'ai).txt       F23(Po).txt       F35(Chin).txt       F47(K\'un).txt      F59(Huan).txt\nF12(P\'i).txt        F24(Fu).txt       F36(Ming I).txt     F48(Ching).txt     F5(Hs\xc3\xbc).txt\nF13(T\'ung J\xc3\xaan).txt  F25(Wu Wang).txt  F37(Chia J\xc3\xaan).txt   F49(Ko).txt        F60(Chieh).txt\nF14(Ta Yu).txt      F26(Ta Ch\'u).txt  F38(K\'uei).txt      F4(M\xc3\xaang).txt       F61(Chung Fu).txt\nF15(Ch\'ien).txt     F27(I).txt        F39(Chien).txt      F50(Ting).txt      F62(Hsiao Kuo).txt\nF16(Y\xc3\xbc).txt         F28(Ta Kuo).txt   F3(Chun).txt        F51(Ch\xc3\xaan).txt      F63(Chi Chi).txt\nF17(Sui).txt        F29(K\'an).txt     F40(Hsieh).txt      F52(K\xc3\xaan).txt       F64(Wei Chi).txt\nF18(Ku).txt         F2(K\'un).txt      F41(Sun).txt        F53(Chien).txt     F6(Sung).txt\nF19(Lin).txt        F30(Li).txt       F42(I).txt          F54(Kuei Mei).txt  F7(Shih).txt\nF1(Ch\'ien).txt      F31(Hsien).txt    F43(Kuai).txt       F55(F\xc3\xaang).txt      F8(Pi).txt\nF20(Kuan).txt       F32(H\xc3\xaang).txt     F44(Kou).txt        F56(L\xc3\xbc).txt        F9(Hsiao Ch\'u).txt\nF21(Shih Ho).txt    F33(TUN).txt      F45(Ts\'ui).txt      F57(Sun).txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何获取示例文件:

\n\n
curl http://www2.unipr.it/~deyoung/I_Ching_Wilhelm_Translation.html|html2text -o I_Ching_Wilhelm_Translation.plain\nsed \'s|^[[:blank:]]*||g\' I_Ching_Wilhelm_Translation.plain > I_Ching_Wilhelm_Translation.txt\n
Run Code Online (Sandbox Code Playgroud)\n