如何获取释放值?

How to get the release value?

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

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

我希望上述文件名的值为:5.12.0.38-quality.zip

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

echo "$fl_name" | sed 's#^[-[:alpha:]_[:digit:]]*##'

fl_name是包含文件名的变量。

非常感谢!

这里使用cut要容易得多:

cut -d- -f3- file

5.12.0.38-quality.zip
5.12.0.38-quality.zip
5.12.0.38-quality.zip

如果你想要sed那么使用:

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

5.12.0.38-quality.zip
5.12.0.38-quality.zip
5.12.0.38-quality.zip

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

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

sed -E 's#^[-[:alpha:]]+(_[[:alnum:]]*-)?##' file

或者你可以缩短第一个字符class,并在末尾匹配一个-

sed -E 's#^[-[:alnum:]_]*-##' file

两个例子的输出

5.12.0.38-quality.zip
5.12.0.38-quality.zip
5.12.0.38-quality.zip

使用 GNU grep 你可以尝试下面的代码。使用显示的示例编写和测试。

grep -oP '(.*?-){2}\K.*'  Input_file

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

grep -oP '(?:[^-]*-){2}\K.*' Input_file

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

假设:

  • 所有文件名都包含 3 个连字符 (-)
  • 期望的结果总是包括剥离第一个两个连字符分隔的字符串
  • OP 想对一个变量执行这个操作

我们可以通过使用参数替换来消除子流程调用的开销(例如,grepcutsed):

$ f1_name='rzp-ASQ_TFC-5.12.0.38-quality.zip'

$ new_f1_name="${f1_name#*-}"                     # strip off first hyphen-delimited string
$ echo "${new_f1_name}"
ASQ_TFC-5.12.0.38-quality.zip

$ new_f1_name="${new_f1_name#*-}"                 # strip off next hyphen-delimited string
$ echo "${new_f1_name}"
5.12.0.38-quality.zip

另一方面,如果 OP 将文件名列表提供给循环结构,并且不需要原始文件名,则在处理之前对文件名列表执行批量操作可能更容易循环,例如:

while read -r new_f1_name
do
    ... process "${new_f1_name)"

done < <( command-that-generates-list-of-file-names | cut -d- -f3-)

简而言之bash:

echo "${fl_name#*-*-}"

捕获数字和字符尾随“-”的 Perl 解决方案

cat f_name | perl -lne 'chomp; /.*?-(\d+.*?)\z/g;print '

你可以对每一行做一个反转,得到最后两个用“-”分隔的元素,然后再反转:

cat "$fl_name"| rev  | cut -f1,2 -d'-' | rev