Bash Scripting - REGEX для вывода списка файлов - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть 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

Итак, мои 2 вопроса связаны стот же кусок кода:

  1. REGEX: что было бы правильным регулярным выражением, чтобы иметь возможность анализировать и выгружать файлы по семейству расширений (см. 4 шаблона ПОИСК и связанные дампы)?

  2. ARRAYS: Как только точка выше решена, как использовать данные массива шаблонов, содержащие заполнитель $ 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".Это не то, что я ищу.

Thx

1 Ответ

0 голосов
/ 06 декабря 2018

Измените строку REGEX в вашем коде на:

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

Регулярное выражение perl, соответствующее базовому имени файла, заключено в одинарные кавычки.Это препятствует тому, чтобы раковина пыталась расширить это.$ Ext в двойных кавычках, поэтому он будет расширен оболочкой.Конечный $ экранируется с обратной косой чертой только для формы.

Начальный ^ (. * / |) Будет соответствовать начальному каталогу (оканчивающемуся на /), [^ / \.] + Будет соответствовать одному илибольше символов, которые НЕ '.'или же '/'.После этого должно следовать «.»и ваше расширение, за которым следует совпадающий конец имени файла ($).

Ключ здесь заключается в том, чтобы привязать ваше совпадение на обоих концах (^ и $) и не допустить появления точек "."кроме тех, которые вам действительно нужны.

Возможно, вы также захотите поместить $ REGEX в кавычки ... "$ REGEX" в команде grep в конце вашего кода.

...