2015-08-31 2 views
1

В настоящее время я пытаюсь пропустить все файлы в определенном каталоге, используя bash. Если файл соответствует следующему регулярному выражению, он выдает имя файла. Если это не так, оно выводит «нет», а затем имя файла. Регулярное выражение должно отфильтровывать любые файлы, имеющие «.». в них.

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 

I подтверждено регулярное выражение here. Есть предположения?

ответ

8

Не указывайте правую часть выражения.

if [[ $f =~ ^[^.]+$ ]]; then 

Цитаты делают строку подстрочной буквой, а не регулярным выражением. Для лучшей переносимости через версии Баш, положить регулярное выражение в переменной (в одинарных кавычках, который сделает обратную косую черту буквальный):

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 
+0

Спасибо так много! Я новый, это было бы просто так. – N8Stewart

+1

Я бы, наверное, пошел с '[[$ f = ~ \. ]] 'и перевернул блоки, если бы я писал это в первую очередь. –

+1

@EtanReisner, ... или '[[$ f = *. *]]'. –

Смежные вопросы