Регулярному выражению не удалось сопоставить имена файлов

Я пытаюсь использовать регулярное выражение для сопоставления имен файлов всех файлов в папке и извлечения достаточных значений. Однако по какой-то причине регулярное выражение не соответствует ни одному файлу в папке, хотя файлы с таким шаблоном существуют.

check() {
    x=$1
    regex="\/tmp\/a\/b\/c\.${x}\.(.+?)"
    while IFS= read -r -d '' file; do
            if [[ "$file" =~ $regex ]]; then
                # do something
            fi
    done < <(find /tmp/a/b -type f -name "c.${x}.*" -print0)
}

Я что-то упустил?

Спасибо!

Пояснение №1: использование findне является обязательным.

Уточнение №2: $xне содержит никаких специальных символов, кроме подчеркивания.

Пояснение №3: (.+?)использовался, потому что я пытался извлечь его и использовать позже через $BASH_REMATCH[1]

Моя папка:

$ ll /tmp/a/b/
total 0
-rw-rw-r-- 1 hc hc 0 Jun 20 15:40 list
0
20.06.2020, 10:47
1 ответ

Вы упомянули, что хотите проверить определенный каталог, а не дерево каталогов, но RE, который вы указали в своем вопросе, не поддерживает это требование.

В этом случае вы, вероятно, можете полностью обойтись без find. Здесь шаблон glob в основном эквивалентен RE ^/tmp/a/b/c\.$x\.([^/]+?)$(, за исключением каких-либо специальных символов RE в $x), но это не совсем то же самое, что и ваш собственный неограниченный RE /tmp/a/b/c.$x\.(.+?).

Пожалуйста, уточните в своем вопросе, правильно ли я -истолковал намерение вашего собственного RE, и я переадресую это сюда.

check() {
    local file
    for file in /tmp/a/b/c."$1".?*
    do
        if [[ -f "$file" ]]
        then
            # do something
            :
        fi
    done
}

Если вам действительно нужно использовать find, попробуйте это

check() {
    find /tmp/a/b -type f -name "c.$1.?*" -print0 |
        while IFS= read -r -d '' file
        do
            # do something
            :
        done
}

С файлом /tmp/a/b/c.1.d_eвызов check 1с любым предложением приведет к оператору :; вы можете проверить это, заменив его наecho "Found $file"

Наконец, поскольку вы упомянули в своем вопросе, что использовали сравнение RE для извлечения последней части совпадения, вы также можете получить это следующим образом

# Assume $file is valid
tail="${file##*/c."$1".}"
echo "Last part of the path is $tail"
2
18.03.2021, 23:26

Теги

Похожие вопросы