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

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)

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

Sté*_*las 9

使用 GNU sed?:

sed 's/;/|/2g'
Run Code Online (Sandbox Code Playgroud)

其全球替换;|从第2发生开始。

虽然sed 's/;/|/2s/;/|/g是 POSIX,但组合不是,并且行为因实现而异。sed然而,随着 GNU 的实现,该行为被清楚地记录在案。


mik*_*erv 7

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 的机器。

它同时将;分号转换为|管道并将|管道转换为\newline。的|作为管搁置\n在壳体ewlines上的输入线的任何发生。然后s///它将第一个出现的|管道替换为;分号,然后将所有\newlines 转换为|管道 - 从而恢复它可能留出的任何内容以稳健地处理单个 s///替换。

虽然我使用<<\INhere-document 是为了复制/粘贴演示,但您可能应该使用<infile >outfile.

输出:

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
Run Code Online (Sandbox Code Playgroud)