0

Rubyで、ファイルからパターンの後のいくつかの行を削除する必要があります。たとえば、次のようなファイルがあります。

# pattern 1
a
b
# end pattern 1
# pattern 2
a
b
c
d
# end pattern 2
# pattern 3
a
b
c
# end pattern 3

# pattern 2との間の行を削除したい# end pattern 2
取得したいファイルは次のとおりです。

# pattern 1
a
b
# end pattern 1
# pattern 3
a
b
c
# end pattern 3
4

3 に答える 3

0

でそれを行うことができますString#gsubが、ドットを改行に一致させるオプションを正規表現に渡す必要があります。

str = <<-STR
# pattern 1
a
b
# end pattern 1
# pattern 2
a
b
c
d
# end pattern 2
# pattern 3
a
b
c
# end pattern 3
STR

puts str.gsub(/(# pattern 2.*# end pattern 2\n)/m, '')
# >> # pattern 1
# >> a
# >> b
# >> # end pattern 1
# >> # pattern 3
# >> a
# >> b
# >> c
# >> # end pattern 3
于 2012-08-07T14:54:27.127 に答える
0

本当に必要でない限り、正規表現は避けたいと思っています。この場合、そうではありません。各行を印刷する行ごとに文字列を反復処理するだけです。「# パターン 2」が表示されたら検出し、行の印刷を停止します。「#終了パターン 2」が表示されたら検出し、ラインの印刷を再開します。これは、ローカルのブール変数を使用して簡単に実行できます。演習として自分で実行する必要があります。Ruby についてあまり知識がなく、何を試せばよいか分からないように思われるからです。

しかし、Ruby には変数を不要にするクールなトリックがあります。

str = <<END
X
# pattern 2
Y
Z
# end pattern 2
Q
END

str.split("\n").each do |line|
  puts line unless (line=="# pattern 2")..(line=="# end pattern 2")
end
于 2012-08-07T15:19:18.597 に答える