如何获取释放值?
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 想对一个变量执行这个操作
我们可以通过使用参数替换来消除子流程调用的开销(例如,grep
、cut
和 sed
):
$ 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
我有一个具有以下名称格式的文件:
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 想对一个变量执行这个操作
我们可以通过使用参数替换来消除子流程调用的开销(例如,grep
、cut
和 sed
):
$ 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