Léo*_* 준영 4 perl text-processing
此问题与我尝试将 Excel 文件中的问题及其答案导入 .txt 文件有关,Anki flashcard 程序按此处所述进行处理。我不能有超过 2 个字段,所以我需要选择一个字段。
按照 Anki 手册中的说明,从 LibreOffice 中存储为 CSV 的数据(分号作为字段分隔符 - 仅区分手册所说的内容)
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
...
Run Code Online (Sandbox Code Playgroud)
其中包含所有选项的每个条目都在一行中,即一个“抽认卡”。在一张卡片中,分号前的前部和分号后的后部。换行符中的第二张抽认卡,依此类推。
想要的输出应该是 UTF-8
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
...
Run Code Online (Sandbox Code Playgroud)
我的 Perl 伪代码基于这个答案
perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file
Run Code Online (Sandbox Code Playgroud)
评论
perl -00 -pe ' # each record is separated by blank lines (-00)
# read the file a record at a time and auto-print (-p)
s/;/\0/; # turn the first semicolon into a null byte
s/;/ |/g; # replace all other semicolons with " |"
s/\0/;/ # restore the first semicolon
' file
Run Code Online (Sandbox Code Playgroud)
如何替换第一个分号后的所有分号?
使用 GNU sed
?:
sed 's/;/|/2g'
Run Code Online (Sandbox Code Playgroud)
其全球替换;
与|
从第2发生开始。
虽然sed 's/;/|/2
和s/;/|/g
是 POSIX,但组合不是,并且行为因实现而异。sed
然而,随着 GNU 的实现,该行为被清楚地记录在案。
sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN
Run Code Online (Sandbox Code Playgroud)
需要注意的是这并没有使用正则表达式来处理大部分的替代品,而是采用了更为基本的(和更高性能) 的翻译功能,这样做-而且这样做的POSIX时尚便携。这应该适用于任何sed
安装了 POSIX 的机器。
它同时将;
分号转换为|
管道并将|
管道转换为\n
ewline。的|
作为管搁置\n
在壳体ewlines上的输入线的任何发生。然后s///
它将第一个出现的|
管道替换为;
分号,然后将所有\n
ewlines 转换为|
管道 - 从而恢复它可能留出的任何内容以稳健地处理单个 s///
替换。
虽然我使用<<\IN
here-document 是为了复制/粘贴演示,但您可能应该使用<infile >outfile
.
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
Run Code Online (Sandbox Code Playgroud)