2012-02-24 3 views
2

同じディレクトリにあるファイルを4つで、繰り返し処理しようとしています。ファイル名に '4'が1つのみ含まれているファイルを反復処理するシェルスクリプト

これまで私がこれまで持っていたことは次のとおりです。私の現在のスクリプトの問題点は4の任意の数のファイルがのファイルは[!4]のようであるが非4つの任意の数の文字のための唯一の4

for i in *4*.cpp; 
do 

... 

ソートではなく、選択してしまうことがあります。 *のhttp://www.tuxfiles.org/linuxhelp/wildcards.html

私は無視するようにme4.cpp、4.cpp、およびhi4hi.cpp

などのファイル名を反復処理したいですlala.cpp、44.cpp、4hi4.cppなどのファイル名

ありがとうございます!

それを実演しました。私は気まぐれに[!4] *を試しました。 おっと私は知らなかった。 、ラインの開始後

^[^4]*4[^4]*$ 

ない-4ののの束4、および:それはあなたが必要とするgrepスタイルの正規表現がある

+1

'*' doesnの」 '4.cpp'をインクルードし、' lala.cpp'を含みます。もう一つの解決策は 'find -regex'を使うことですが、この場合どのような式を使うのか分かりません... –

+0

' [!4] * '' 'a44.cpp'、' a444.cpp '、' a4444.cpp'など –

答えて

3

([!4])、その後(*)として解釈されますラインの終わりには4の別の束。純粋なシェルで

case文の使用を検討して:

for file in *4*.cpp 
do 
    case "$file" in 
    (*4*4*) : Ignore;; 
    (*)  : Process;; 
    esac 
done 

4つのを含む名前を探し、その後、2以上4代を含むものを無視します。

+0

これには '4.cpp'が含まれていません。 [^ 4] * 4 [^ 4] * 'でforを実行することで、そのgrep構文をBashのglobbing機能に組み込むことができます。 –

+0

@Daniel:なぜ4.cppが含まれていないのですか? '* 4 * .cpp'のパターンは確かに' 4.cpp'を含みます。パターン '* 4 * 4 *'はそれを除外しません。シェルグロブの代わりに正規表現を考えていますか?これらの星はグロブです。正規表現では、各 '*'は前の文字の繰り返しではなく、 '。*'(任意の文字の0個以上)と等価です。 –

0

どのように仮定すると、find

find ./ -regex "<regular expression>" 
0

はbashを使用してについて:[!4] *([^4])ではない、ゼロ以上の文字を意味

shopt -s extglob 
for file in *([^4])4*([^4]).cpp; ... 

"4"

関連する問題