2016-05-25 9 views
0

が、このディレクトリ内のファイルの多くは、次のとおりです。ディレクトリ内のファイル名のこのパターンとどのように一致させ、一致したものを出力できますか?

[[email protected] data]$ ls 
data.list 
data.root 
ntuple.data15_13TeV.00276262.DAOD_FTAG2.root 
ntuple.data15_13TeV.00276329.DAOD_FTAG2.root 
ntuple.data15_13TeV.00276336.DAOD_FTAG2.root 
ntuple.data15_13TeV.00276416.DAOD_FTAG2.root 
ntuple.data15_13TeV.00276511.DAOD_FTAG2.root 

と私はちょうどのパターンを持っているこれらのファイルを含むリスト作りたい:などのようなファイル名を一致させるために

[many chars].[many chars].[many numbers].[many chars].root 

を:

ntuple.data15_13TeV.00276262.DAOD_FTAG1.root 
ntuple.data15_13TeV.00276329.DAOD_FTAG2.root 
ntuple.data15_13TeV.00276336.DAOD_FTAG3.root 
etc... 

どのように私は、この目標を達成するために正規表現を使用できますか? 多分私達は、この構文を使用することができます。

for f in `ls`;do if [....];then echo $f;fi;done > log.list 
+0

「パターンのような」 - >まさにそのようなものですか?どういう意味?どのような形式で表現すべきかを単語で表現したり、一致するファイル名の例を複数提示できますか? – Dropout

+0

@Dropoutこんにちは、私はあなたの要件に一致するように私のquesionを編集しました。 –

答えて

2

を行う必要があり、多くの道はローマにつながります。 :)

ls | egrep '^\w*\.\w*\.[0-9]*\.\w*\.root$' 

^がライン の始まりを示す$ *多くの作業文字 wは\単語文字 wは\行 の終わりを示します。リテラル 'です。文字、マスクされていない '。'

for f in `ls`;do echo $f | egrep '^\w*\.\w*\.[0-9]*\.\w*\.root$';done 

そして今、if文を含む:

regurlar表現に0と9

そして、あなたの具体的な例のための数字のいずれかである「任意の文字」 [0-9]の略

for f in `ls`; do if [[ $f =~ '\w*\.\w*\.[0-9]*\.\w*\.root' ]]; then echo $f; fi; done 

この場合、一致するように行の先頭と末尾(^ ... $)を削除する必要がありました。理由は分かりません。一般的に、=〜は正規表現をチェックします。

+0

より。しかし、どうすればこの文法を使うことができますか? 'ls'のfの場合; [....]の場合はdo; then echo $ f; fi; done> log.list?ちょうど好奇心のため。 –

+0

forループを追加しましたが、構文のどの部分を保持したいかは完全にはわかりません。 – Bugfinger

+0

"if"を使用したい場合、どうすれば実現できますか? –

0

それはそのように複雑にする必要はありません。特定のパターンに一致するファイルをリストするだけで済みます。ワイルドカードは基本的に十分です。正規表現は必要ありません。

ls -1 ntuple.data*.*.*.root > log.list 
+0

ありがとうございます、私の好奇心で、私はregexpの使い方と、以下のような構文を知りたいと思います:for f in 'ls'; if [...];次にecho $ f;を実行します。 fi;完了しました。これはいくつかの複雑な場合に使用できます。 –

1
ls | grep '..*[.]..*[.][0-9][0-9]*[.]..*[.]root > log.list 

正規表現の土地で仕事

+0

'.' outside []は任意の文字に一度マッチし、'。* 'の外側は[]で0個以上の文字にマッチします。' '。 ''はちょうど1つのドットにマッチします –

+0

ありがとう!しかし、どのように '' ls'のfのような構文を使うことができますか?[....]ならばdo then $ f; fi; done> log.listを実行してください。あなたの方法はうまくいくはずですが、私はまだ興味があります。 –

+0

何らかの理由がありませんが、if ... for $(ls); echo "$ f" | grep -q ;テスト$? -eq 0 && echo $ f;済んだ?テスト用のものを必要に応じてifのものに置き換えることができます。 –

関連する問題