grep返回行,但排除模式

时间:2019-12-02 12:38:37

标签: 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]"

1 个答案:

答案 0 :(得分:0)

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

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

shopt -s extglob
for file in *.jar ; do
    printf '%s\n' "${file%%-+([0-9.]).jar}"
done

有时,使用功能更强大的REGEX会更容易,它可以用于定义拒绝诸如“ 5..2.jar”等组合的规则。此外,制作REGEX规则通常比模式规则更容易。

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

对于大量文件,还应该考虑使用相同的REGEX进行sed。通常它效率更高,并且可以用于使用xargs等创建更复杂的命令。

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