如何获取释放值?

Use*_*123 17 regex grep cut sed

我有一个具有以下名称格式的文件:

rzp-QAQ_SA2-5.12.0.38-quality.zip
rzp-TEST-5.12.0.38-quality.zip
rzp-ASQ_TFC-5.12.0.38-quality.zip
Run Code Online (Sandbox Code Playgroud)

我想要的值为:5.12.0.38-quality.zip来自上面的文件名。

我尝试如下,但没有得到正确的值:

echo "$fl_name" | sed 's#^[-[:alpha:]_[:digit:]]*##'
Run Code Online (Sandbox Code Playgroud)

fl_name是包含文件名的变量。

预先非常感谢!

The*_*ird 7

-您与_同一字符类中的所有字母、数字匹配太多。

您可以匹配 alpha 和-以及可选的_和 字母数字

sed -E 's#^[-[:alpha:]]+(_[[:alnum:]]*-)?##' file
Run Code Online (Sandbox Code Playgroud)

或者您可以缩短第一个字符类,并-在末尾匹配 a :

sed -E 's#^[-[:alnum:]_]*-##' file
Run Code Online (Sandbox Code Playgroud)

两个示例的输出

5.12.0.38-quality.zip
5.12.0.38-quality.zip
5.12.0.38-quality.zip
Run Code Online (Sandbox Code Playgroud)


Rav*_*h13 5

使用 GNUgrep你可以尝试下面的代码。使用所示示例进行编写和测试。

grep -oP '(.*?-){2}\K.*'  Input_file
Run Code Online (Sandbox Code Playgroud)

或者作为替代用途(使用非捕获组解决方案,根据第四只鸟的好建议):

grep -oP '(?:[^-]*-){2}\K.*' Input_file
Run Code Online (Sandbox Code Playgroud)

说明:这里使用GNUgrep。在grep程序中使用-oP选项,该选项用于匹配精确匹配的值并分别在程序中启用 PCRE 风格。然后在主程序中,使用正则表达式(.*?-){2}意味着,使用惰性匹配直到-这里两次(以获取-此处的前2个匹配),然后使用\K选项以确保到目前为止匹配的值被遗忘,并且仅打印下一个提到的正则表达式匹配的值,它将在此处打印其余值。


anu*_*ava 4

cut这里使用起来更容易:

cut -d- -f3- file

5.12.0.38-quality.zip
5.12.0.38-quality.zip
5.12.0.38-quality.zip
Run Code Online (Sandbox Code Playgroud)

如果您愿意,sed请使用:

sed -E 's/^([^-]*-){2}//' file

5.12.0.38-quality.zip
5.12.0.38-quality.zip
5.12.0.38-quality.zip
Run Code Online (Sandbox Code Playgroud)