数据
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 中的sed
or 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)//
然而,我想你会发现这并不完全是你想要做的,因为在你的示例输出中,c
和b
都在自己的一行上。如果您替换所有后面不跟有另一个换行符的换行符,它们将连接到前面的行上,即您将拥有:
23. LoremA) heB) haC) huc
2. Ipsun yes right to write something here?A) OkB) No C) yesb