在文件列表中:
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
我通过上面的数据通过许多正则表达式测试程序运行我的正则表达式,并且它们都返回正确的匹配,但我无法在我的脚本中使用它。
我如何循环,并检查是否有任何文件与此正则表达式匹配?
答案 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
请注意,假设此上下文中的正则表达式锚定在行的开头。