2009-03-31 7 views
20

Ho uno script scritto in ruby. Ho bisogno di togliere qualunque a capo duplicati (per esempio)Come sostituire più newline di fila con una newline usando Ruby

\n 
\n 
\n 

a

\n 

Il mio tentativo di corrente ha funzionato (o meglio non) usando

str.gsub!(/\n\n/, "\n") 

che mi ha dato alcun cambiamento per l'uscita . Che cosa sto facendo di sbagliato?

risposta

29

questo funziona per me:

#!/usr/bin/ruby 

$s = "foo\n\n\nbar\nbaz\n\n\nquux"; 

puts $s 

$s.gsub!(/[\n]+/, "\n"); 

puts $s 
+1

Perché le parentesi? –

+0

Dato che era un anno fa, non ne ho idea. Mi aspetto di aver provato/\ n + /, poiché è quello che userei in Perl, e non ha funzionato per me, probabilmente perché ho fatto qualcos'altro. –

+0

Penso che s.gsub! (/ \ N + /, "\ n") funzioni. Almeno funziona nel mio portatile. – swcai

4

sei sicuro che non dovrebbe essere/\ n \ n \ n /, "\ n" quello che sembri desiderare nella tua domanda sopra.

Inoltre, sei sicuro che non stia facendo una nuova riga di windows "\ r \ n"?

EDIT: Ulteriori informazioni

Per Commento

"La quantità di nuove righe può cambiare linee differenti hanno tra 2 e 5 a capo."

se solo si vuole colpire le linee 2-5 provare questo

/\n{2,5}/, "\n" 
+0

La quantità di nuove righe può cambiare. Linee diverse hanno tra 2 e 5 righe nuove. – Macha

+1

Molte grazie per il callout '\ r \ n'. Per quello che vale, non è solo Windows, l'ho incontrato quando usavo i dati da un input textarea su un sito di Rails sulla mia macchina Linux. Certo, altri fattori potrebbero influenzare i dati, ma il punto è che Windows non è uno di questi. – DreadPirateShawn

+1

\ r \ n ha funzionato perfettamente. Abbiamo trascorso 1,5 ore per trovare la soluzione perfetta ed eccolo qui. Grazie @Keng – sapatelbaps

6

Semplicemente scissione e ricombinando le linee darà il risultato desiderato

>> "one\ntwo\n\nthree\n".split.join("\n") 
=> "one\ntwo\nthree" 

Edit: Ho appena notato questo sostituirà TUTTE le sottostringhe degli spazi bianchi con nuove righe, ad es

>> "one two three\n".split.join("\n") 
=> "one\ntwo\nthree" 

Prima verifica che questo sia quello che desideri!

+0

bello - questo è un ottimo modo per farlo! – Brian

+0

Grazie, ho selezionato questo come risposta, ma poi ho realizzato che si divide anche su spazi, il che non è buono nel mio caso. Mi dispiace per quello – Macha

+0

Hai ragione. Potresti usare str.split (/ \ n + /) ma Chas. La soluzione di Owens è più semplice. – finnw

1

Semplicemente chiamando scissione sarà anche tagliare fuori tutti i vostri spazi.

è necessario passare \n dividere

>> "one ok \ntwo\n\nthree\n".split(/\n+/).join("\n") 
=> "one ok \ntwo\nthree" 
5

È necessario far corrispondere più di una nuova linea fino a una quantità infinita.Il tuo esempio di codice lavorerà con solo un tweak minore:

str.gsub!(/\n+/, "\n") 

Ad esempio:

str = "this\n\n\nis\n\n\n\n\na\ntest" 
str.gsub!(/\n+/, "\n") # => "this\nis\na\ntest" 
1

Inoltre, funziona anche con

  • spazi sulle righe vuote
  • n numero di schiena indietro linee vuote

str.gsub!/\ N^\ s * \ n/"\ n \ n"

dove,

  • \ n è naturalmente newline
  • \ s è lo spazio
  • denota 1 o più spazi quando usati dopo \ s
+0

Questa è la risposta più precisa in questo thread. –

+0

Quasi nessuno di questi indirizzi il carattere '\ r'. Vorrei modificare questo al seguente: 'str.gsub (/ [\ n \ r] +^\ s * [\ r \ n] + /," \ n \ n ")' – Dex

9

Utilizzare il più idioma String#squeeze anziché gsub.

str = "a\n\n\nb\n\n\n\n\n\nc" 
str.squeeze("\n") # => "a\nb\nc" 
-1

Try This ha funzionato per me:

s = test\n\n\nbar\n\n\nfooo 

s.gsub("\n\n", '')