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,因此它不能使用\d
or+
等。)
\n我认为最好的方法是awk
和gawk
。
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\'ien
和The Creative
。稍后我们可以用 来引用这些字段$n
。$0
是整条线。
然后我们告诉 awk 将行与模式匹配 ^[0-9]{1,3}[.]
如果有匹配,我们然后将值分配给x
。值 x 将用作操作的文件名print
。在此示例中,我们使用"F"$1"("$2").txt"
so 该行1. Ch\'ien / The Creative
给出文件名F1(Ch\'ien).txt
在gawk中,我们还可以访问捕获的组。因此我们可以将命令简化为:\n
\n\ngawk \'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]
是每组。
我们也可以使用 perl 来完成:\n
\n\nperl -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\ncurl 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
归档时间: |
|
查看次数: |
27074 次 |
最近记录: |