我一直試圖從一個看起來像這樣的檔案中只提取部分字串:
str1=USER_NAME
str2=justAstring
str3=https://product.org/v-4.5-bin.zip
str4=USER_HOME
我只需要提取版本 - 在這種情況下: 4.5
我是通過 grep 然后 sed 完成的,但現在輸出是 4.5-bin.zip
-> grep str3 file.txt
str3=https://product.org/v-4.5-bin.zip
-> echo str3=https://product.org/v-4.5-bin.zip | sed -n "s/^.*v-\(\S*\)/\1/p"
4.5-bin.zip
我應該怎么做才能洗掉-bin.zip最后的?謝謝。
uj5u.com熱心網友回復:
第一個解決方案:使用您顯示的示例,請嘗試以下sed代碼。
sed -n '/^str3=/s/.*-\([^-]*\)-.*/\1/p' Input_file
說明:使用sed's-n選項將默認停止列印值,只列印匹配的部分。在主程式檢查條件中,如果行從str3=那里開始,則在那里執行替換。在替換中捕獲捕獲組中1st-和 next之間的所有內容,并-通過使用\1和僅通過使用p選項列印匹配部分來替換整行。
第二種解決方案:使用 GNUgrep您可以嘗試以下grep程式。
grep -oP '^str3=.*?-\K([^-]*)' Input_file
第 3 種解決方案:使用awk程式根據顯示的 smaples 獲得預期輸出。
awk -F'-' '/^str3=/{print $2}' Input_file
第 4 種解決方案:使用awk'smatch函式在使用RSTART和RLENGTH變數的幫助下獲得預期結果,一旦 match 函式找到 TRUE 匹配就會設定這些變數。
awk 'match($0,/^str3=.*-/){split(substr($0,RSTART,RLENGTH),arr,"-");print arr[2]}' Input_file
uj5u.com熱心網友回復:
如果您知道該版本僅包含數字和點,請替換\S為[0-9.]. 此外,匹配捕獲組之外的剩余字符以將其洗掉。
sed -n 's/^.*v-\([0-9.]*\).*/\1/p'
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/372407.html
下一篇:注釋掉檔案中兩個不同模式之間的行
