我有一個正則運算式模式([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]*。
uj5u.com熱心網友回復:
您的正則運算式很簡單,可以用 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
uj5u.com熱心網友回復:
要修復正則運算式,您需要在點前匹配至少 1 個數字,如果使用它,則在 sql 前匹配一個文字點
([0-9] \.) [0-9]*_to_([0-9] \.) [0-9]*\.sql
https://regex101.com/r/5xB3Bt/1
uj5u.com熱心網友回復:
您不能在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')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/478755.html
