Я пытаюсь использовать регулярное выражение для сопоставления имен файлов всех файлов в папке и извлечения достаточных значений. Однако по какой-то причине регулярное выражение не соответствует ни одному файлу в папке, хотя файлы с таким шаблоном существуют.
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
Вы упомянули, что хотите проверить определенный каталог, а не дерево каталогов, но 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"