解析jar文件名

时间:2016-05-27 18:19:49

标签: regex bash jar filenames

假设您希望 best 模式从jar文件名中提取名称和版本。我得到了不那么糟糕的东西,它适用于regexr但不适用于bash。这是因为bash不支持非贪婪的正则表达式。那么如何应对呢?

#!/bin/bash

filename="./log4j-enhanced-3.5.100-v20130422-1538.jar"

if [[ "$filename" =~ \.\/(.*?)-([0-9].*)\.jar ]]; then
        echo "name    =  ${BASH_REMATCH[1]}"
        echo "version =  ${BASH_REMATCH[2]}"
fi

# expected :
# name    = log4j-enhanced
# version = 3.5.100-v20130422-1538

使用unix实用程序是可以的,但请让它可读。

3 个答案:

答案 0 :(得分:3)

使用GNU bash' Parameter Expansion

filename="./log4j-enhanced-3.5.100-v20130422-1538.jar"

filename="${filename#./}"
name="${filename%%-[0-9]*}" 
version="${filename#$name-}"
version="${version%.jar}"

echo "name    = $name"
echo "version = $version"

输出:

name    = log4j-enhanced
version = 3.5.100-v20130422-1538

答案 1 :(得分:2)

您可以使用

filename="./log4j-enhanced-3.5.100-v20130422-1538.jar"

if [[ "$filename" =~ [.]/([[:alnum:]-]*)-([0-9].*)[.]jar ]]; then
        echo "name    =  ${BASH_REMATCH[1]}"
        echo "version =  ${BASH_REMATCH[2]}"
fi

请参阅Ideone demo

[[:alnum:]-]*将贪婪地匹配字母数字和连字符以及后跟数字的连字符。

答案 2 :(得分:0)

如果你想在不使用Bash特殊功能的情况下完成同样的事情,可以采取以下措施:

#!/bin/sh
filename="./log4j-enhanced-3.5.100-v20130422-1538.jar"

regex='.\/\(.*\)-\([0-9]\+\.[0-9]\+.*\)\.jar'

name="$(echo $filename | sed -e "s/$regex/\1/")"
version="$(echo $filename | sed -e "s/$regex/\2/")"

echo "   name: $name"
echo "version: $version"

输出:

   name: log4j-enhanced
version: 3.5.100-v20130422-1538