2017-12-14 9 views
2

を検索していなかった、私はgrepのは私のPerlスクリプトでは、適切

$tmp=`grep -E -n 'FRAME.*$atom_id'\$'\\s{1,}''$spc_lbl{$all_species}' $file_o_nghb_refine |wc -l` 

ところ、$tmp$atom_id$spc_lbl[]以下のbashのコードを実行し、$all_speciesは、変数や配列の要素です。しかし「トイレ-l」

FRAME  0 11687 Fe 7744AL 
FRAME  1 11687 Fe 7744AL 
FRAME  2 11687 Fe 7744AL 
FRAME  3 11687 Fe 7744AL 
FRAME  4 11687 Fe 7744AL 
FRAME  5 11687 Fe 7744AL 
FRAME  6 11687 Fe 7744AL 
FRAME  7 11687 Fe 7744AL 
FRAME  8 11687 Fe 7744AL 
FRAME  9 11687 Fe 7744AL 
FRAME 10 11687 Fe 7744AL 
...... 

を削除する場合は通常、(他のすべてのファイルは、すべてのファイルが中断することなく、私のプログラムによって生成され、一つのファイルを除いて、正しく結果を表示)、結果は上記のコードは、以下のような値を示すだろう1つのファイルを適切に表示できません。実際に、私が直接bashコードを使用すると、
grep 'FRAME 0 11687'$'\s{0,}''Fe' 15x200.lammpstrj.o_neighbors.raw.dat のいずれかの結果も見つかりませんでした。私が使用する場合

grep 'FRAME.*11687.*Fe' 15x200.lammpstrj.o_neighbors.raw.dat 

上記のように表示されます。

何か問題がありますか?スクリプトをどのように改善できますか?これ以外のファイルでも同じスクリプトが動作するのはなぜですか?それ以上の提案は高く評価されるだろう。

+3

を使用することが特にgrep'正しく関与しなければならない 'を呼び出すので、自身 –

+0

何をするかgrepを行うことが可能以上だときのperlのコールはgrepを有するビット奇妙に思えます提供されるよりもはるかに多くのコード。 (注入バグ、エラー処理の欠如) – ikegami

答えて

1

$'\s{0,}'はあなたの考えではないので、直接使用されるbashコードは機能しません。 $'...'は、Cエスケープシーケンスを補間する。 $'\n'は改行に展開されます。 $'\s'は単に定義されておらず、\sと置き換えられます。あなたがゼロ以上の空白文字をgrepする必要がある場合は、

grep '...[[:space:]]*...' 
関連する問題