Bash grep返回行但排除模式

Bash grep返回行但排除模式,bash,grep,find,Bash,Grep,Find,我正在寻找一种从文件名生成目录的方法,而不需要 版本是它的一部分。我需要将这个新目录设置为一个变量,这样我就可以提取、chmod symlink等等 find *.jar | grep -Ei "*-[0-9]." /test/gb0100-sting-junit5-1.5.0.0.jar 我只需要gb0100-sting-junit5部件 我知道我可以只过滤版本部分,但我以前不知道如何正则化该部分 grep -Po "-[0-9].[0-9].[0-9].[0-9]" 对于更一般的情况,当

我正在寻找一种从文件名生成目录的方法,而不需要 版本是它的一部分。我需要将这个新目录设置为一个变量,这样我就可以提取、chmod symlink等等

find *.jar | grep -Ei "*-[0-9]."
/test/gb0100-sting-junit5-1.5.0.0.jar
我只需要gb0100-sting-junit5部件

我知道我可以只过滤版本部分,但我以前不知道如何正则化该部分

grep -Po "-[0-9].[0-9].[0-9].[0-9]"

对于更一般的情况,当版本号可能大于一个数字时,或者当版本中的数字组的数量可以大于或小于4时,考虑以下选项:

使用bash模式,消除数字/点和jar后缀的尾随序列

shopt -s extglob
for file in *.jar ; do
    printf '%s\n' "${file%%-+([0-9.]).jar}"
done
有时,使用功能更强大的正则表达式更容易,它可以用来定义拒绝“5..2.jar”等组合的规则。此外,创建正则表达式规则通常比创建模式规则更容易

for file in *.jar ; do
   [[ "$file" =~ ^(.*)-+([0-9])(\.[0-9]+)*.jar$ ]] && printf '%s\n' "${BASH_REMATCH[1]}"
done

对于大量文件,还应考虑SED,使用相同的正则表达式。它通常效率更高,可用于使用xargs等创建更复杂的命令

ls *.jar | sed -E -e 's/^(.*)-+([0-9])(\.[0-9]+)*.jar$/\1/'

塞德为我做了这件事。你是对的。忘了提到一次部署多个文件。非常感谢您的支持!