我正在尝试使用bash遍历某个目录中的所有文件。如果文件与以下正则表达式匹配,则输出文件名。如果没有,则输出'not'然后输出文件名。正则表达式应该过滤掉任何带有'。'的文件。在他们中间。
for f in * ; do
if [[ $f =~ "^[^\.]+$" ]]; then
echo "$f"
else
echo "not $f"
fi
done
它正确地循环遍历所有文件,但由于一个让我困扰了很长一段时间的原因,我不能让它只排除带有'。'的文件。在他们中。例如,在包含以下文件的目录中:
bashrc
gitconfig
install.sh
README.md
vimrc
脚本的输出是这样的:
not bashrc
not gitconfig
not install.sh
not README.md
not vimrc
我验证了正则表达式here。有什么想法吗?
答案 0 :(得分:8)
不要引用表达的右侧。
if [[ $f =~ ^[^.]+$ ]]; then
引号使字符串成为文字子字符串,而不是正则表达式。 为了在bash版本中实现更好的可移植性,请将正则表达式放在一个变量中(单引号,这将使反斜杠文字化):
re='^[.]+$'
if [[ $f =~ $re ]]; then
那就是说,你也可以用一个extglob做到这一点:
shopt -s extglob # enable extended globs
for f in +([!.]); do
printf 'Matched %q\n' "$f"
done
...或使用通用模式匹配:
for f in *; do
if [[ $f = *.* ]]; then
printf '%q contains a dot\n' "$f"
else
printf '%q does not contain a dot\n' "$f"
fi
done