我有一個具有以下名稱格式的檔案:
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 是包含檔案名的變數。
非常感謝!
uj5u.com熱心網友回復:
您正在使用的所有字母,數字匹配過多-而_在相同的字符類。
您可以匹配字母-和可選的_字母數字
sed -E 's#^[-[:alpha:]] (_[[:alnum:]]*-)?##' file
或者您可以縮短第一個字符類,并-在末尾匹配 a :
sed -E 's#^[-[:alnum:]_]*-##' file
兩個示例的輸出
5.12.0.38-quality.zip
5.12.0.38-quality.zip
5.12.0.38-quality.zip
uj5u.com熱心網友回復:
使用 GNU,grep您可以嘗試以下代碼。使用所示樣本進行撰寫和測驗。
grep -oP '(.*?-){2}\K.*' Input_file
或作為替代用途(使用非捕獲組解決方案,根據第四只鳥的好建議):
grep -oP '(?:[^-]*-){2}\K.*' Input_file
說明:grep此處使用 GNU。在grep程式中使用-oP用于匹配精確匹配值并分別在程式中啟用 PCRE 風格的選項。然后在主程式中,使用正則運算式(.*?-){2}意味著,-在此處使用延遲匹配直到2 次(以獲得此處的前 2 個匹配-)然后使用\K選項以確保直到現在匹配的值被遺忘,并且只列印下一個提到的正則運算式匹配的值,這將在此處列印其余值。
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
假設:
- 所有檔案名都包含 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-)
uj5u.com熱心網友回復:
簡單地說bash:
echo "${fl_name#*-*-}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/337887.html
