Как заменить несколько строк новой строки в одной новой строке с помощью Ruby

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

\n
\n
\n

к

\n

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

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

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

Ответ 1

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

#!/usr/bin/ruby

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

puts $s

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

puts $s

Ответ 2

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

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

Ответ 3

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

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

Изменить: я только заметил, что это заменит ВСЕ пробелы подстроки новыми символами, например.

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

Сначала убедитесь, что это то, что вы хотите!

Ответ 4

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

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

Например:

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

Ответ 5

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

Кроме того, вы уверены, что он не делает окна новой строки "\ r\n"?

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

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

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

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

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

Ответ 6

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

Вам нужно передать \n для разделения

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

Ответ 7

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

  • пробелы в пустых строках
  • n количество обратных к обратным пустым строкам

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

где

  • \n, конечно, новая строка
  • \s - это пространство
  • обозначает 1 или более пробелов при использовании после \s

Ответ 8

Ruby требует, чтобы обратная косая черта бежала иначе, чем вы предоставили.

str.sub!("\\\\n+\\\\n","\\\\n")

http://www.ruby-forum.com/topic/176239

Ответ 9

Попробуй это, я работал у меня:

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

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