2016-11-14 3 views
1

В списке файлов:Как запустить регулярное выражение для имени файла?

javascript-custom-rules-plugin-1.0-SNAPSHOT.jar 
README.txt 
sonar-build-breaker-plugin-2.0.jar 
sonar-javascript-plugin-2.11.jar 
tmo-custom-rules-1.0.jar 

Я пытаюсь соответствовать этим имена файлов с помощью регулярных выражений.

My Script

#!/usr/bin/env bash 

install_location=/usr/local/sonar/extensions/plugins 

for f in $(ls -1 $install_location) 
do 
    # remove any previous versions of this plugin 
    if [[ "$f" =~ ".*tmo-custom-rules-(.+)\.jar" ]] 
    then 
     echo "found $f. will remove" 
    else 
     echo "$f doesn't match" 
    fi 
done 

Я попытался if [[ "$f" =~ ".*tmo-custom-rules-(.+)\.jar" ]] и if [[ "$f" == *"tmo-custom-rules" ]] безрезультатно.

Я получаю

javascript-custom-rules-plugin-1.0-SNAPSHOT.jar doesn't match 
README.txt doesn't match 
sonar-build-breaker-plugin-2.0.jar doesn't match 
sonar-javascript-plugin-2.11.jar doesn't match 
tmo-custom-rules-1.0.jar doesn't match 

, когда я ожидал found tmo-custom-rules-1.0.jar. will remove

Я бегу мое регулярное выражение через множество регулярных выражений тестировщиков с приведенными выше данными, и все они возвращают правильные матчи, но я не может заставить его работать здесь в моем скрипте.

Как я могу пройти цикл и проверить, соответствуют ли какие-либо файлы этому регулярному выражению?

ответ

3

В BASH регулярное выражение должно быть без кавычек, так это должно работать:

[[ $f =~ .*tmo-custom-rules-(.+)\.jar ]] 

Или лучше:

re=".*tmo-custom-rules-(.+)\.jar" 
[[ $f =~ $re ]] 

Однако вы даже не нужно регулярное выражение и может использовать оболочку соответствия Глоб:

#!/usr/bin/env bash 

install_location=/usr/local/sonar/extensions/plugins 

for f in "$install_location"/* 
do 
    # remove any previous versions of this plugin 
    if [[ $f == *tmo-custom-rules-*.jar ]] 
    then 
     echo "found $f. will remove" 
    else 
     echo "$f doesn't match" 
    fi 
done 

Обратите внимание, что вы можете избежать использования вывода ls, который не всегда подходит для сценариев.

+1

работает отлично. Я оставил свой оператор 'for' в одиночку и не кавычками' $ f'. glob соответствия работает так, как я хотел. благодаря! +1 для решения регулярного выражения, а также для моего вопроса. я буду использовать сопоставление glob. – sircapsalot

+0

Это не регулярное выражение, а шаблон оболочки. Возможно, это то, чего действительно хочет оригинальный плакат? –

+1

отредактировал мой комментарий, @RobDavis, спасибо. anubhava также предоставил решение для регулярного выражения, но просто предложил альтернативу. в любом случае - они оба работают – sircapsalot

1

Вы можете сделать это с помощью expr оператор двоеточия:

if expr "$f" : '.*tmo-custom-rules-.*\.jar' > /dev/null; then 
    echo matches 
fi 

Обратите внимание, что регулярные выражения в данном контексте предполагается привязываться к началу строки.

+0

ok, ваш тоже работал, но не с моим '(. +)' Ограничением. любая идея почему? – sircapsalot

+0

Он не работает с расширенными регулярными выражениями, а плюс действует только в расширенных регулярных выражениях. См. Http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html. –

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