我正在尝试使用正则表达式来匹配文件夹中所有文件的文件名并提取后缀。但是,由于某种原因,正则表达式似乎与文件夹中的任何文件都不匹配,尽管存在具有此类模式的文件。
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
答案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
}
对于 file /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"