2009-03-31 2 views
20

У меня есть скрипт, написанный на рубине. Мне нужно удалить все повторяющиеся переводы строк (например)Как заменить несколько строк новой строки одной новой строкой с использованием Ruby

\n 
\n 
\n 

в

\n 

Моя текущая попытка работал (или, вернее, не) с помощью

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

Который не дал мне никаких изменений на выходе , Что я делаю не так?

ответ

29

Это работает для меня:

#!/usr/bin/ruby 

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

puts $s 

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

puts $s 
+1

Почему скобки? –

+0

С тех пор, как год назад, я понятия не имею. Я ожидаю, что я попробовал/\ n + /, так как это то, что я буду использовать в Perl, и это не сработало для меня, возможно потому, что я сделал что-то еще неправильно. –

+0

Я думаю, что s.gsub! (/ \ N + /, "\ n") работает. По крайней мере, это работает на моем ноутбуке. – swcai

4

Вы уверены, что это не должно быть \ n \ n \ n /, "\ n", что вы, кажется, хотите в своем вопросе выше.

также, вы уверены, что это не делает окна новой строки «\ r \ n»?

EDIT: Дополнительная информация

Per комментарий

"Количество переводов строк может изменить различные линии имеют между 2 и 5 новых строк."

, если вы хотите, чтобы ударить 2-5 строк попробовать это

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

Количество переводов строк может измениться. Различные линии имеют от 2 до 5 строк новой строки. – Macha

+1

Большое спасибо за выноску '\ r \ n'. Для чего это стоит, это не только Windows, либо - я столкнулся с этим при использовании данных из ввода textarea на сайте Rails на моем Linux-боксе. Конечно, другие факторы также могут влиять на данные, но дело в том, что Windows не является одним из них. – DreadPirateShawn

+1

\ r \ n работал отлично. Отработал 1,5 часа, чтобы найти идеальное решение, и вот оно. Спасибо @Keng – sapatelbaps

6

Просто расщепление и рекомбинацию линии даст желаемый результат

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

Edit: Я просто заметил заменит ВСЕ пробельные подстроки символами новой строки, например

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

Сначала проверьте, что это то, что вы хотите!

+0

хороший один - это отличный способ сделать это! – Brian

+0

Спасибо, я выбрал это как ответ, но потом понял, что он тоже разбивается на пробелы, что плохо в моем случае. Извини за это. – Macha

+0

Вы правы. Вы можете использовать str.split (/ \ n + /), но Chas. Решение Owens проще. – finnw

1

Просто вызова Раскол также отсечь все ваши пробелы.

Вам необходимо пройти \n разделить

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

Вы должны соответствовать более чем один символ новой строки до бесконечного количества.Ваш пример кода будет работать только с незначительной подстройкой:

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

Например:

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

Кроме того, также работает с

  • пространств на пустых строках
  • п числа заднего на обратные пустые линии

str.gsub!/\ П^\ с * \ п /, "\ п \ п"

где

  • \ п, конечно, символ новой строки
  • \ s пространство
  • обозначает 1 или больше пробелов при использовании после \ s
+0

Это наиболее точный ответ в этой теме. –

+0

Вряд ли любой из них адресует символ '\ r'. Я бы изменил это на следующее: 'str.gsub (/ [\ n \ r] +^\ s * [\ r \ n] + /," \ n \ n ")' – Dex

9

Используйте более идиоматический String#squeeze вместо gsub.

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

Try This Он работал для меня:

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

s.gsub("\n\n", '') 
Смежные вопросы