2017-02-23 7 views
0

私はDropbox Uploaderを使用しており、以下のようなファイルのリストを$lineとして出力できます。私は部分的に特定のファイルに一致したいが、私はこの正規表現を動作させることはできない。私はそれが働くregexr.comでそれを試してみましたが、ユースケースが端末Bash-regexが一致しません

person_02-15-2017_21-01-42.sql 
person_02-17-2017_11-42-01.sql 
person_02-17-2017_12-00-02.sql 

上記の $list

> Listing "/"... DONE 
[F] 168953708 person_02-15-2017_21-01-42.sql 
[F] 170024815 person_02-17-2017_11-42-01.sql 
[F] 170012760 person_02-17-2017_12-00-02.sql 

の予想される出力のない

./dropbox_uploader.sh list | while read line 
do 
     if [[ $line =~ /person_(.*}?).sql/g ]]; 
     then 
       echo "match"; 
     else 
       echo "no match"; 
     fi 
#echo "$line" 
done 

電流出力を行い、私は基本的にしていますファイル名を持つ行と一致するようにしようとし、そのファイル名だけを出力します。

+0

期待される出力?あなたの入力のために? – Inian

+0

@Inian更新されたオリジナルの投稿 –

+2

あなたの正規表現がうまくいかなかった理由は誰も強調しませんでしたので、ここでそれを行っています: '/ pattern/flags'構造体は' bash'(あるいはほとんどの言語では)に存在しません。 '=〜'演算子を使うのは、後に続くものが正規表現のパターンであることを指定するものです。 '[[" [F] 168953708 person_02-15-2017_21-01-42.sql "=〜person _(。*}?)。sql]] &&エコーマッチ||エコーはありませんでした。 – Aaron

答えて

0

あなたはbashでこれを行うには、より堅牢な正規表現の方法を探しているなら、

while IFS= read -r line 
do 
    if [[ $line =~ .*person_([[:alnum:]|_|-]+)\.sql ]]; then 
     printf "person_%s.sql\n" "${BASH_REMATCH[1]}" 
    fi 
done <file 

を行うこと

person_02-15-2017_21-01-42.sql 
person_02-17-2017_11-42-01.sql 
person_02-17-2017_12-00-02.sql 
1

あなたの正規表現が壊れているが、私はあなたが必要としないことを示唆している1:

これは、ファイル名は常に出力の3番目のフィールドで開始することと、あなたがいずれかを使用していないことを前提としてい
./dropbox_uploader.sh list | while read -r tag size file; do 
    if [[ $file = person* ]]; then 
     # do something with "$file" 
    fi 
done 

あなたのファイル名の改行。

必要に応じてグロブパターンをより具体的にすることができます(例: person*person*.sqlに変更します。

+0

IMHO、これは.sqlで終わるパターンがチェックされていないことを確認します。 – Inian

+0

@Inian true、必要に応じてglobをより具体的にするように編集しました。 –

0

として、私は基本的にどのラインに一致するようにしようとしている結果を生成そのファイル名だけを出力します。私はあなたの正規表現では、オプションの最終}を守ってきた

./dropbox_uploader.sh list | awk '/person_.*}?\.sql/{print $3}' 

が、私は本当にしないでください。

だから、あなたは(あなたのファイル名にスペースが含まれていない場合)これ以上何を必要としませんその理由を見てください。.はそれに一致します。 }?を省略すると、まったく同じ結果が得られます。

bashで一致する正規表現は、/区切り文字もg修飾子も使用していないため動作しませんでした。

関連する問題