如何替换第一个分号之后的所有分号?

如何替换第一个分号之后的所有分号?

这个问题与我尝试将 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/;/|/2s/;/|/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///第一个出现的|管道替换为;分号,然后将所有\newline 转换为|管道 - 从而恢复它可能留出的任何内容以稳健地处理单个 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

相关内容