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是包含文件名的变量。
预先非常感谢!
-您与_同一字符类中的所有字母、数字匹配太多。
您可以匹配 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)
使用 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选项以确保到目前为止匹配的值被遗忘,并且仅打印下一个提到的正则表达式匹配的值,它将在此处打印其余值。
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)