我希望能夠從字串后面的檔案(yaml)中檢索版本號(nnn)。
sdk: ">=0.2.4 <3.1.1"
version: ^2.3.1
sdk: flutter
version: 1.0.0 1
sed -n '/version:/p sample.yaml
它回傳提供的字串“版本:”的行,然后我將其傳送到另一個命令grep以模式匹配版本號的行:
sed -n '/version:/p sample.yaml | grep -oP '(\[0-9\] ).(\[0-9\] ).(\[0-9\] )'
我想看看是否有更有效的方法來執行此操作,并且如果示例中的 string = 'sdk' 當我想回傳單個值時,回傳的值會同時回傳。
uj5u.com熱心網友回復:
采用awk
awk '/version:/ {
pos=match($2, /[0-9] \.[0-9] \.[0-9] /);
print substr($2, pos, RLENGTH); }' sample.yaml
match()回傳找到正則運算式的欄位中的位置,并設定RLENGTH為它的長度。
uj5u.com熱心網友回復:
您可以使用
sed -nE 's/.*version:[^0-9]*([0-9][0-9.]*).*/\1/p' file
grep -oP 'version:\D*\K\d[\d.]*' file
查看在線演示:
#!/bin/bash
s='sdk: ">=0.2.4 <3.1.1"
version: ^2.3.1
sdk: flutter
version 1.0.0 1'
sed -nE 's/.*version:[^0-9]*([0-9][0-9.]*).*/\1/p' <<< "$s"
# => 2.3.1
grep -oP 'version:\D*\K\d[\d.]*' <<< "$s"
# => 2.3.1
version:\D*\K\d[\d.]* grep正則運算式匹配version:子字串,然后是任何零個或多個非數字(帶\D*),然后省略匹配的文本(帶\K),然后匹配并回傳一個數字,然后是任何零個或多個數字或點(帶\d[\d.]*)。
sedPOSIX ERE(請參閱-E啟用此正則運算式風格的選項)模式匹配
.*- 任何文字version:- 一個固定的子串[^0-9]*- 零個或多個非數字([0-9][0-9.]*)- 第 1 組 (\1):一個數字,然后是零個或多個數字或點.*- 任何文字。
整個匹配被替換為組 1 值,p標志列印成功替換的結果(-n抑制默認行輸出)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455247.html
上一篇:使用execve()呼叫“/usr/bin/envbash”時無法定義變數
下一篇:在Linux中驗證用戶輸入
