删除\n但不删除\n\n

删除\n但不删除\n\n

数据

23. Lorem
A) he
B) ha
C) hu
c

2. Ipsun yes right to write something here?
A) Ok
B) No 
C) yes
b

292. Ipsun
A) Apex
B) hello
b

289. He
A) hu
B) Ha
C) He
The right answer is:
1) Ab
2) Abc
3) Ac
2

替换应返回以满足 Quizlet.com 的语法要求

23. Lorem A) he B) ha C) hu
c    
2. Ipsun yes right to write something here? A) Ok B) No C) yes 
b
292. Ipsun A) Apex B) hello
b
289. He A) hu B) Ha C) He The right answer is: 1) Ab 2) Abc 3) Ac
2

s/\n//g这会删除Vim 中的所有空白。

如何在 Perl 或 Vim 中删除所有 \n 但不删除 \n\n ? 我认为有必要展望因为在知道没有第二个 \n 之前你无法替换。

答案1

新的 GNU sed (带有参数 -z)只需执行一次即可:

sed -z 's/\n\(\n\|[A-Z0-9][)a-z]\)/ \1/g' DATA

答案2

也许使用awk+ sed?为了:

$ cat quiz 
23. Lorem
A) he
B) ha
C) hu
c

2. Ipsun yes right to write something here?
A) Ok
B) No 
C) yes
b

跑步

$ awk NF=NF RS= OFS=' ' quiz | sed 's/\([a-z]$\)/\n\1/' 

23. Lorem A) he B) ha C) hu 
c
2. Ipsun yes right to write something here? A) Ok B) No C) yes 
b

答案3

我喜欢玩正则表达式,但实际上我并不觉得自己是它的大师。我会分两步做你想做的事:

$ perl -i.bak -0pe  's/\n([A-Z])/ \1/g' DATA
$ less DATA
23. Lorem A) he B) ha C) hu
c

2. Ipsun yes right to write something here? A) Ok B) No  C) yes
b

现在只需删除空行,例如Emacs 中的sedor function:flush-lines

$ sed '/^$/d' -i DATA
$ less DATA
23. Lorem A) he B) ha C) hu
c
2. Ipsun yes right to write something here? A) Ok B) No  C) yes
b

或者只需:按 Vim 并粘贴以下内容:/^$/d

编辑:

$ perl -i.bak -0pe 's/\n([A-Z0-9]\))/ \1/g' DATA

答案4

语法为vim 中的负向前瞻是这样的:

:s/\n\n\@!//gN

在哪里N有几行。 在 Perl 中, 这将是:

s/\n(?!\n)//

然而,我想你会发现这并不完全是你想要做的,因为在你的示例输出中,cb都在自己的一行上。如果您替换所有后面不跟有另一个换行符的换行符,它们将连接到前面的行上,即您将拥有:

23. LoremA) heB) haC) huc
2. Ipsun yes right to write something here?A) OkB) No C) yesb  

相关内容