2016-12-23 5 views
-2

大きなCプロジェクトでいくつかのファイルを修正するためのRubyコードを書いていました。 そして、私はこれを書いた -split( " n")が動作しない、またはエラーをスローしない

x = `find $PWD/ | grep "\.h"` 
x = x.split("\n") 
... 

私のコードは、なぜこれが、新しい行に分割しないでください?

enter image description here

+0

x.countの値は? – codeforester

+1

'find $ PWD/|の結果の例を示します。 grep "\ .h" ' –

+0

@YuHaoあなたは今見てみることができますか? –

答えて

1

あなたの分割はOKであり、あなたはそれがなかった証拠を持っていないが、あなたのシェルコマンドは、おそらくあなたが期待するものを行うので、私はそれについてはコメントせません。あなたは明らかにCヘッダファイル(.hで終わるファイル)の一覧は、しかしたい

  • $PWDはあなたが$PWD =>findにホワイトスペースを持っている場合は、あなたの悩みの原因となる引用されていませんがそこだと思いますパラメータにいくつかのディレクトリがあります
  • \.hはrubyで引用されず、ちょうど.hとしてgrepに渡されます。魔法使いは「任意の文字の後に 'h'」を意味します。リテラル検索にはgrep -F .hを使用してください。
  • grepは、文字列のどこにでも.hを検索します。あなただけ.hで終わるファイルをしたい場合は、(当時grep、ないgrep -Fで).h$をgrepしなければならない
  • ないfind+grep、名前だけで見つける:find -name "<pattern>"。より簡単で、軽く、より安全。環境についての行が\n(LF)で終了していないものを
  • 代わり
  • あなたは改行文字を含むファイル名の中から、あなたのコードを保護することをお勧めします=>findは、この文字の上に\0と分割してファイル名を分離している
  • しかし、CR-LFまたはCRだけでは?ここfind -print0再び

は、結果のプログラムは私見であるべきものです=>:

x = `find "$PWD" -name "*.h" -print0` 
x = x.split("\0") 
+0

それはどういうわけか、それは私の端末の失敗であり、別のものを使っているのです –

+0

注: '-print0'は非標準の拡張です。すべての「発見」がそれを持っているわけではありません。 –

3

サブシェルを起動する必要はありません、RubyはDir.globが付属しています:

header_files = File.join(Dir.pwd, '**', '*.h') 
x = Dir.glob(header_files) 

あなたは省略することができます相対パスが大丈夫ならばDir.pwd

+0

ああ、新しいことを学んだ、ありがとう –

関連する問題