簡體   English   中英

使用正則表達式遍歷與 bash 腳本中特定模式匹配的文件

[英]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

https://regex101.com/r/5xB3Bt/1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM