2016-10-17 6 views
0

if文を同じ行の複数の文字列に対してgrepに変更するにはどうすればよいですか?ruby​​の同じ行に複数の文字列をgrepする方法

string = "1.1.1.1 example.com" 
if File.readlines("/etc/hosts").grep(/#{string}/).any? 
    exit 
else 
    File.open("/etc/hosts", "w") { |file| file.write(host_file)} 
end 

これはbashでどのように動作するかです:

if grep -q "1.1.1.1 example.com"; 
    then 
     exit 
else 
    echo "1.1.1.1 example.com" >> /etc/hosts 
fi 
+0

これ以上の試みをしたいと思います。あなたは 'string'のために何を使いましたか?なぜそれは動作しませんでしたか? –

答えて

0

私はあなたが使用する必要があると思う "How to read lines of a file in Ruby" を見てから:

File.readlines('foo').each do |line| 

ラインの全てを読み出すためにファイル内で、各行でgrepを実行します。

1

個人的には、ホストファイルを手動で解析する代わりにResolv::Hostsを使用することをおすすめします。ライブラリに組み込まれているので、あなた自身が思いつくものよりもはるかに優れたエッジケースに対応できます。

これはlocation of the hosts file on different systemsで始まり、1.1.1.1 example2.com example.comのようなエントリがあり、grepの表現には一致しません。

+0

理由を説明してください。 –

0

あなたが求めていることは完全にはっきりしていませんが、文脈から、配列内の複数のエントリを検索するためのパターンが必要なようです。readlinesは、ファイル。

単純なパターンの例は次のようになります

%w[foo bar baz].grep(/foo|bar/) # => ["foo", "bar"] 
|

手段 "または" ので、パターン/foo|bar/"foo" or "bar"を探しています。 grepは配列['foo', 'bar']を反復処理し、両方を検出します。

これは、森の中で待っているドラゴンがいるため、全体の解決策ではありません。

最も可能性が高い ない何をしたいです
%w[food bartender].grep(/foo|bar/) # => ["food", "bartender"] 

/foo|bar/は実際には部分文字列ではなく、完全な単語を一致しています。

%w[foo bar baz].grep(/\bfoo\b|\bbar\b/) # => ["foo", "bar"] 
%w[food bartender].grep(/\bfoo\b|\bbar\b/) # => [] 

\bは「単語の境界」は、非単語文字と単語文字間の遷移であることを意味:私たちは言葉を見つけるだけに正規表現エンジンに指示する必要があり、この問題を解決するには

\wは使用されるパターンで、the Regexp documentationで定義されています。 I STRONGLYには、実行可能なその他の潜在的な問題があるので、それについて読むことをお勧めします。しかし、私たちの目的のためには、\bとデフォルトの動作はおそらく良いです。

ありその小さなパターンでの重複の多くは、しかしだ、と正規表現は、私たちは、レプリケーションをトリムしてみましょう:

%w[foo bar baz].grep(/\b(foo|bar)\b/) # => ["foo", "bar"] 
%w[food bartender].grep(/\b(foo|bar)\b/) # => [] 

周囲\bが適用されますので、キャプチャグループに括弧グループfoo|barを使用しますかっこの中の何かに、ノイズを減らす。

実際には文字列をキャプチャしたくない場合もあります。そうであれば、ドキュメンテーションの非キャプチャグループについて読むことができます。

関連する問題