这个问题与我尝试将 Excel 文件中的问题及其答案导入 .txt 文件有关,Anki 抽认卡程序按所述处理该文件这里。我不能有超过 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
...
其中包含所有选项的每个条目都在一行中,即一张“抽认卡”。在一张卡片中,前半部分在分号之前,后半部分在分号之后。换行符中的第二张抽认卡等等。
想要的输出应该是 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
...
我的 Perl 伪代码基于此回答
perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file
评论过
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
如何替换第一个分号之后的所有分号?
答案1
使用 GNU sed
:
sed 's/;/|/2g'
;
从|
第二次出现开始全局替换。
虽然sed 's/;/|/2
和s/;/|/g
是 POSIX,但组合不是 POSIX,并且行为因实现而异。然而,通过 GNU 实现sed
,该行为被清楚地记录下来。
答案2
sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN
请注意,这确实不是使用正则表达式来处理大多数替换,而是使用更基本的(并且性能更高) 翻译函数来做到这一点 - 并且以 POSIX 可移植的方式做到这一点。这应该适用于任何sed
安装了 POSIX 的机器。
它同时将;
分号翻译为|
管道,并将|
管道翻译为ewlines。\n
这些|
管道被留作\n
线路,以防输入线路上出现任何情况。然后,它将s///
第一个出现的|
管道替换为;
分号,然后将所有\n
ewline 转换为|
管道 - 从而恢复它可能留出的任何内容以稳健地处理单个 s///
替换。
虽然我使用<<\IN
此处文档来进行复制/粘贴演示,但您可能应该使用<infile >outfile
.
输出:
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
答案3
简单地sed -e 's/;/|/g' -e 's/|/;/' data.csv
让你:
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
这看起来像你想要的。
答案4
你犯了一个小错误:
~$ perl -00 -pe 's/;/\0/; s/;/\n/g; s/\0/;/' file
Question; option 1
option 2
option 3
option 4
...
option n
你做了什么:
s/;//g; # remove all other semicolons
s/\0/;/ # restore the first semicolon
你所说的你想要什么:
s/;/\n/g; # change all other semicolons
s/\0/;/ # restore the first semicolon