web-dev-qa-db-ja.com

Rubyを使用して、行内の複数の改行を1つの改行に置き換える方法

Rubyで書かれたスクリプトがあります。重複する改行を削除する必要があります(例)

\n
\n
\n

\n

私の現在の試みは使用して(またはむしろ)うまくいかなかった

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

これにより、出力に変化はありませんでした。何が悪いのですか?

25
Macha

これは私にとってはうまくいきます:

#!/usr/bin/Ruby

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

puts $s

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

puts $s
33
Chas. Owens

より慣用的なString#squeezeの代わりにgsub

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

行を分割して再結合するだけで、望ましい結果が得られます

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

編集:私はこれがすべての空白の部分文字列を改行で置き換えることに気づきました、例えば.

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

まず、これが必要なものであることを確認してください。

6
finnw

/\n\n\n /、 "\ n"が上記の質問で望んでいるように見えてはいけません。

また、Windowsの改行「\ r\n」を実行していないのですか?

編集:追加情報

コメントごと

「改行の数は変わる可能性があります。行ごとに2〜5個の改行があります。」

あなたが2-5行をヒットしたいだけならこれを試してください

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

複数の改行を無制限に一致させる必要があります。コード例は、マイナーなTweakで動作します。

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

例えば:

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

Splitを呼び出すだけでも、すべての空白が削除されます。

分割するには\nを渡す必要があります

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

さらに、以下でも動作します

  • 空白行のスペース
  • n行連続した空白行

str.gsub!/\ n ^\s *\n /、「\ n\n」

どこ、

  • \ nもちろん改行です
  • \ sはスペース
  • \ sの後に使用する場合、1つ以上のスペースを示します
1
Ninad