[英]using regex to iterate over files that matches a certain pattern in bash scripts
我有一個正則表達式模式([0-9]*\.)+[0-9]*_to_([0-9]*\.)+[0-9]*
,匹配的字符串是 11.1.1.1_to_21 .1.1.1。 我想發現具有上述模式的目錄下的所有文件。
但是我無法使用下面的代碼正確獲取它。 我試圖通過在它們之前添加 \ 來逃避(和),但這沒有用。
dir=$SCRIPT_PATH/oaa_partition/upgrade/([0-9]*\.)+[0-9]*_to_([0-9]*\.)+[0-9]*.sql
for FILE in $dir; do
echo $FILE
done
我只能做這樣的事情
dir=$SCRIPT_PATH/oaa_partition/upgrade/[0-9]*_to_*.sql
for FILE in $dir; do
echo $FILE
done
需要一些關於如何使用完整正則表達式模式([0-9]*\.)+[0-9]*_to_([0-9]*\.)+[0-9]*
的幫助。
您的正則表達式很簡單,可以用 bash extglob替換它
#!/bin/bash
shopt -s extglob
glob='+(*([0-9]).)*([0-9])_to_+(*([0-9]).)*([0-9]).sql'
for file in "$SCRIPT_PATH"/oaa_partition/upgrade/$glob
do
printf '%q\n' "$file"
done
如果正則表達式太復雜而無法將其轉換為擴展的 glob,那么您可以在for
循環中使用 bash 正則表達式過濾文件:
#!/bin/bash
regex='([0-9]*\.)+[0-9]*_to_([0-9]*\.)+[0-9]*\.sql'
for file in "$SCRIPT_PATH"/oaa_partition/upgrade/*_to_*.sql
do
[[ $file =~ /$regex\.sql$ ]] || continue
printf '%q\n' "$file"
done
順便說一句,您的正則表達式可以匹配很多不需要的東西,例如: 0._to_..sql
。
如果這足以將目標文件與其他文件區分開來,那么您可能只需使用基本的 glob [0-9]*_to_[0-9]*.sql
您不能在for
循環中使用正則表達式。 它只支持 glob 模式,並且不如正則表達式那么健壯。
您必須在gnu-find
命令中使用您的正則表達式:
find . -mindepth 1 -maxdepth 1 -regextype egrep -regex '.*/([0-9]*\.)+[0-9]*_to_([0-9]*\.)+[0-9]*\.sql'
要循環這些條目:
while IFS= read -rd '' file; do
echo "$file"
done < <(find . -mindepth 1 -maxdepth 1 -regextype egrep -regex '.*/([0-9]*\.)+[0-9]*_to_([0-9]*\.)+[0-9]*\.sql')
要修復正則表達式,您需要在點前匹配至少 1 個數字,如果使用它,則在 sql 前匹配一個文字點
([0-9]+\.)+[0-9]*_to_([0-9]+\.)+[0-9]*\.sql
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.