解析 jar 文件名
Parse 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实用程序的使用没问题,但请使其可读。
您可以使用
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
[[:alnum:]-]*
将贪婪地匹配字母数字和连字符字符,直到一个连字符后跟一个数字。
使用 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
如果您想在不使用 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//")"
version="$(echo $filename | sed -e "s/$regex//")"
echo " name: $name"
echo "version: $version"
输出:
name: log4j-enhanced
version: 3.5.100-v20130422-1538
假设您希望 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实用程序的使用没问题,但请使其可读。
您可以使用
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
[[:alnum:]-]*
将贪婪地匹配字母数字和连字符字符,直到一个连字符后跟一个数字。
使用 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
如果您想在不使用 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//")"
version="$(echo $filename | sed -e "s/$regex//")"
echo " name: $name"
echo "version: $version"
输出:
name: log4j-enhanced
version: 3.5.100-v20130422-1538