如何针对文件名运行正则表达式?

时间:2016-11-14 20:15:41

标签: regex bash

在文件列表中:

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

我试图通过正则表达式匹配这些文件名。

我的剧本

#!/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

我通过上面的数据通过许多正则表达式测试程序运行我的正则表达式,并且它们都返回正确的匹配,但我无法在我的脚本中使用它。

我如何循环,并检查是否有任何文件与此正则表达式匹配?

2 个答案:

答案 0 :(得分:3)

在BASH正则表达式必须不加引号,所以这应该有效:

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

或更好:

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

但是你甚至不需要正则表达式并且可以使用shell glob匹配:

#!/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 :(得分:1)

您可以使用冒号运算符expr执行此操作:

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

请注意,假设此上下文中的正则表达式锚定在行的开头。