原生bash regexp [[$ f =〜“^ [^ \。] + $”]]从不匹配

时间:2015-08-31 18:27:26

标签: regex linux bash loops

我正在尝试使用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。有什么想法吗?

1 个答案:

答案 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