Novo GNU sed (com o parâmetro -z) faça uma passagem:
sed -z 's/\n\(\n\|[A-Z0-9][)a-z]\)/ /g' DATA
Dados
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
onde a substituição deve retornar para atender aos requisitos de sintaxe do 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
Isso remove todos os espaços vazios, s/\n//g
no Vim.
Como você pode remover tudo \ n, mas não \ n \ n em Perl ou Vim? Eu acho que há uma necessidade de Look-ahead porque você não pode substituir antes que você saiba que não há segundo \ n.
Usando awk
+ sed
, talvez? Para:
$ 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
Executar
$ awk NF=NF RS= OFS=' ' quiz | sed 's/\([a-z]$\)/\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
Eu gosto de brincar com expressões regulares, mas realmente não sinto que sou um mestre nisso. Eu faria o que você quer em 2 passos:
$ perl -i.bak -0pe 's/\n([A-Z])/ /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
E agora apenas remova as linhas vazias, por exemplo com a função sed
ou flush-lines
no Emacs:
$ 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
Ou apenas pressione :
no Vim e cole isto: /^$/d
.
EDITAR:
$ perl -i.bak -0pe 's/\n([A-Z0-9]\))/ /g' DATA
(Solução editada devido ao feedback sobre os requisitos reais ...)
Provavelmente é mais fácil de entender e implementar se você executá-lo em quatro etapas; substitua \ n \ n por algum caractere [controle] não utilizado (digamos \ a), adicione um \ a na frente de uma linha com \ a, depois delete tudo \ n, e finalmente substitua \ a por \ n novamente. (Defina uma macro vim se você precisar dessa substituição com freqüência.)
No vim (ex.mode), por exemplo:
:%s/\n\n/^A/
:g/^A/s/^/^A/
:%s/\n/ /g
:%s/^A/^M/g
em que ^A
é criado por <ctrl>-V <ctrl>-A
e ^M
é criado por <ctrl>-V <Enter>
.
A sintaxe para uma lookahead negativa no vim é assim:
:s/\n\n\@!//gN
Onde N
é um número de linhas. No perl , seria:
s/\n(?!\n)//
No entanto , acho que você descobrirá que não é exatamente o que está tentando fazer, já que na saída de exemplo, c
e b
estão ambos em uma linha própria. Se você substituir todas as novas linhas não seguidas por outra nova linha, elas serão concatenadas às linhas anteriores, ou seja, você terá:
23. LoremA) heB) haC) huc
2. Ipsun yes right to write something here?A) OkB) No C) yesb
Tags perl regular-expression