Para remover \ n, mas não \ n \ n

0

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.

    
por Léo Léopold Hertz 준영 08.03.2015 / 15:05

5 respostas

3

Novo GNU sed (com o parâmetro -z) faça uma passagem:

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

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
    
por 08.03.2015 / 15:54
1

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
    
por 08.03.2015 / 16:17
1

(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> .

    
por 08.03.2015 / 20:08
0

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  
    
por 08.03.2015 / 15:32