簡體   English   中英

Bash腳本-REGEX轉儲文件列表

[英]Bash Scripting - REGEX to dump a file list

由於先前的工作,我有4個文件擴展名,存儲在$ SEARCH數組中,如下所示:

declare -a SEARCH=("toggled" "jtr" "jtr.toggled" "cupp")

我要為上述4個擴展名模式中的每一個發布一個文件列表,如下所示,但帶有2個點和2個擴展名(標記為“否”)的情況除外:

################################################################################
1 - SEARCH FOR toggled in /media
regex   : ([^\/]+)(\.)(toggled)$
command : find /media -type f | grep --color -P ([^\/]+)(\.)(toggled)$
################################################################################
/media/myfile_1.jtr.toggled --> NO
/media/myfile_1.toggled
/media/myfile_2.jtr.toggled --> NO
/media/myfile_2.toggled
/media/myfile_3.jtr.toggled --> NO
/media/myfile_3.toggled


################################################################################
2 - SEARCH FOR jtr in /media
regex   : ([^\/]+)(\.)(jtr)$
command : find /media -type f | grep --color -P ([^\/]+)(\.)(jtr)$
################################################################################
/media/myfile_1.jtr
/media/myfile_2.jtr
/media/myfile_3.jtr


################################################################################
3 - SEARCH FOR jtr.toggled in /media
regex   : ([^\/]+)(\.)(jtr.toggled)$
command : find /media -type f | grep --color -P ([^\/]+)(\.)(jtr.toggled)$
################################################################################
/media/myfile_1.jtr.toggled
/media/myfile_2.jtr.toggled
/media/myfile_3.jtr.toggled


################################################################################
4 - SEARCH FOR cupp in /media
regex   : ([^\/]+)(\.)(cupp)$
command : find /media -type f | grep --color -P ([^\/]+)(\.)(cupp)$
################################################################################
/media/myfile_1.cupp
/media/myfile_2.cupp
/media/myfile_3.cupp

顯然我花了數小時沒有成功的regex101 我還嘗試使用其他方法來實現我的目標,而這些方法與其余的代碼不匹配。

這是代碼摘錄:

for ext in "${SEARCH[@]}"
do

    COUNTi=$((COUNTi+1))

    REGEX="([^\/]+)(\.)("$ext")$" #
    # Ideally, the Regex should come from a pattern array

    printf '%*s' "$len" | tr ' ' "$mychar"
    echo -e "\n$COUNTi - SEARCH FOR $ext in $BASEDIR"
    echo "regex   : $REGEX"
    echo "command : find $BASEDIR -type f | grep --color -P $REGEX"
    printf '%*s' "$len" | tr ' ' "$mychar" && echo

    find $BASEDIR -type f | grep --color -P $REGEX 
    # the Regex caveats as the double dot extensions are not parsed correctly.

    echo -e "\n"

done

所以我的兩個問題與同一段代碼有關:

  1. REGEX:什么是正確的正則表達式,以便能夠按擴展名家族解析和轉儲文件(請參閱4種SEARCH模式和相關的轉儲)?

  2. 數組:解決以上問題后,如何將包含$ extension占位符的模式數組數據用於循環的REGEX中?

      PATTERN+=( "([^\\/]+)(\\.)($ext)$" ) # All of these below : CAVEATS escaping $ or not... # REGEX=${PATTERN[5]} # REGEX=$(eval "${PATTERN[5]}" ) # echo "pattern : ${PATTERN[5]}" # eval "$REGEX=\\$REGEX" # eval "$REGEX=\\"\\$REGEX\\"" # REGEX=$(echo "${REGEX}") # REGEX=${!PATTERN[5]} 

注意:我閱讀了數小時的所有正則表達式文檔,嘗試了數百種正則表達式模式,但由於我無法理解這些正則表達式的原理而沒有成功。
我還嘗試了其他方法,例如find / -name "sayONEnameinmysearchpattern" ! -iname "theothernamesfromtehsearchpattern" find / -name "sayONEnameinmysearchpattern" ! -iname "theothernamesfromtehsearchpattern" 這不是我想要的。

謝謝

將代碼中的REGEX行更改為:

REGEX='^(.*\/|)[^\/\.]+\.'"$ext\$"

與文件的基本名稱匹配的perl正則表達式用單引號引起來。 這樣可以防止外殼嘗試擴展外殼。 $ ext用雙引號引起來,因此它將被shell擴展。 尾隨的$用反斜杠轉義,僅用於形式。

前導^(。* / |)將匹配一個前導目錄(以/結尾),[^ / \\。] +將匹配一個或多個不是'。'的字符。 要么 '/'。 然后必須在后面加上“。”。 和擴展名,然后是要匹配的文件名($)的末尾。

這里的關鍵是在兩端(^和$)錨定您的匹配項,並且不允許任何點“。”。 除了你真正想要的。

您可能還希望將$ REGEX放在引號中...在代碼提取末尾附近的grep命令中加上“ $ REGEX”。

暫無
暫無

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

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