4

簡単な質問があります。次のようなファイルがあります。

ip-10-0-12-84.eu-west-1.compute.internal, master, instnum=1, Running
.....
.....
ip-10-0-26-118.eu-west-1.compute.internal, master_rabbit, instnum=4, Running
ip-10-0-26-116.eu-west-1.compute.internal, master_rabbit, instnum=5, Running
.....
ip-10-0-26-68.eu-west-1.compute.internal, sql_master, instnum=9, Running
ip-10-0-13-244.eu-west-1.compute.internal, nat, instnum=2, Running

私の目標は、ファイルを読み、コメント(で始まる#)、空/空白行、natまたはその中の行をスキップmasterすることです。私はこれを試しました:

open('/tmp/runnings.txt').each do |line|
    next if line =~ /(^\s*(#|$)|nat|master)/

これはほとんど機能していますが、その中の行も削除さmaster_rabbitsql_masterます。master他の組み合わせを選択せず​​に選択するにはどうすればよいですか? 同じラインでできますか?乾杯!!

4

3 に答える 3

6

単語境界アンカーは次の場合に役立ちます。

/^\s*(#|$)|\b(nat|master)\b/
于 2013-11-04T10:46:18.543 に答える
1
open("/tmp/runnings.txt").each_line
.grep(/\A(?!\s*#)(?!.*\bnat\b)(?!.*\bmaster\b).*\S/) do |line|
  ...
end
于 2013-11-04T10:46:27.247 に答える
1

これは、正規表現で問題を解決するべき場所ではないと思います。確かに今のところ機能するものを取得できますが、除外する新しいキーワードを取得すると、後で理解するのが難しくなり、編集するのが難しくなります.

私はこの問題を解決する方法が好きです:

FILE_PATH = '/tmp/runnings.txt'
keywords  = ['nat', 'master']
empty_lines_and_comments     = ->x{ x.chomp.empty? or x.start_with?('#') }
lines_containing_bad_keyword = ->x{ keywords.include? x[1] } # Keywords at index 1

data = File.readlines(FILE_PATH)
           .reject(&empty_lines_and_comments)
           .map{|line| line.chomp.split(', ')}
           .reject(&lines_containing_bad_keyword)
于 2013-11-04T11:42:54.220 に答える