我在一個bash變數中擁有這個字串
name : br-ext protocols : [protocol] name : br-ex協議:[] name : br-local 協議:[其他協議] name : br-int協議:[]
還有一個變數$br,其中包含name : values(即br-ext)
。給定$br,我想訪問它后面的協議字串(所以$br br-ext應該得到'協議',$br-ex應該得到'')
我試了一下,但似乎不能訪問變數的值
echo $protocols | grep -oP " (? <="$br") [^ ]*"
任何提示?
uj5u.com熱心網友回復:
你可以使用
echo "$protocols" | grep -oP "$brs protocolss*: s*[K[^][]*"
查看在線演示
注意,$protocols在雙引號內(變數有引號)。
該模式匹配
s- 一個或多個空格 。
protocols--單詞protocolss*:s*- 用零個或多個空格括起來的冒號 。
[- 一個[字符 。
K- 洗掉到目前為止匹配的所有文本 。
[^][]*- 除了[>和]以外的零個或多個字符。
uj5u.com熱心網友回復:
用你顯示的樣本,請嘗試以下awk代碼,其中protocol和br是shell變數。
echo "$protocols" !
awk -v br="$br"'
{
match($0,br" [^:]*:[[:space:] [^]]*")
val=substr($0,RSTART,RLENGTH)
sub(/.*[/,""/span>,val)
列印val。
}
'
解釋:為上述代碼添加詳細解釋。
echo "$protocols" | ##列印協議變數的值并作為標準輸入發送到awk程式這里。
awk -v br="$br" ' ##從這里開始啟動awk程式,定義awk的br變數,其中有br shell變數值。
{
match($0,br" [^:]*:[[:space:]] [^]]*") ##使用awk的匹配功能來匹配br值后的空格直到冒號第一次出現后的空格直到第一次出現的】。
val=substr($0,RSTART,RLENGTH) ##在這里創建與regex子字串值匹配的val。
sub(/.*[/,"",val) ##使用sub來替換所有內容,直到[ in val.。
print val ##printing val here.
}
'
uj5u.com熱心網友回復:
假設br永遠不會包含regexp metachars或/s,那么在每個Unix盒子的任何shell中使用任何sed:
$ str='name : br-ext protocols : [protocol] name : br-ex protocols : [] name : br-local protocols : [other protocol] name : br-int protocols : [] '
$ br='br-ext'
$ echo "$str"/span>| sed -n 's/. *name : '"$br"' protocols : [([^]*) .*/1/p'
協議
$ br='br-ex'
$ echo "$str"/span>| sed -n 's/. *name : '"$br"' protocols : [([^]*) .*/1/p'
$
uj5u.com熱心網友回復:
你可以在純Bash中做到這一點,不需要使用外部工具。(但是這個解決方案肯定是針對Bash的。其他類似的功能也存在于其他shells中,但沒有標準化。)
[[ $protocol =~ "name : $br protocols : ["([^]]*)"]" ] ]
&& extracted=${BASH_REMATCH[1]}
|| echo "未找到"
上述模式假設輸入的內容與你的問題中所示完全一致。如果這個假設是錯誤的,可能需要做一些調整。
=~是Bash的擴展條件運算式([[...]])語法中使用的regex匹配運算子 。
$BASH_REMATCH是=~在模式有捕獲時留下捕獲的字串。- 和大多數的regex實作一樣,
[^]]意味著 "除]以外的任何東西,因為字符集的第一個字符被允許是]或-。 - 注意:正則運算式中的regex元字符可能很棘手,因為正則運算式中在引號中的部分被視為普通字串,不管它的注釋如何。所以我不能把整個模式寫在引號里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/314870.html
標籤:
