[英]Fetch specific value from output using grep+regex and store in variable in shell
首先要為這個愚蠢的問題道歉,因為我對此根本不是專家。
我已經完成了以下任務:
image4.png PNG 1656x839 1656x839+0+0 8-bit sRGB 155KB 0.040u 0:00.039
image4.png PNG 1656x839 1656x839+0+0 8-bit sRGB 155KB 0.020u 0:00.030
Image: image4.png
Channel distortion: AE
red: 0
green: 0
blue: 0
all: 0
image4.png=>tux_difference.png PNG 1656x839 1656x839+0+0 8-bit sRGB
137KB 0.500u 0:00.140
從這里,我只想獲取所有的價值
為此,我正在嘗試這樣做:
var="$(compare -verbose -metric ae path/actual.png path/dest.png path/tux_difference.png 2>&1 | grep 'all:\s(\d*)')"
但是它什么也沒做。
采用
"sudo apt-get install imagemagick"
使比較可行。 建議對源和目標使用相同的圖像,否則某些圖像不匹配會出現錯誤。
您可能需要在以下位置轉義括號(或僅刪除它們):
grep 'all:\s\(\d*\)'
但是,默認情況下,grep將打印整行,這不是您想要的。 僅打印匹配的文本是可能的,但是要從中提取數字,則需要更復雜的正則表達式,這可能在您的grep版本中可用或不可用。 GNU grep具有P
標志,可像正則表達式一樣啟用Perl,僅使用o
標志可以輸出匹配項。
另一方面,我的建議是直接使用Perl:
perl -ne 'print $1 if /all: (\d+)/'
請注意,您也不需要$()
周圍的引號。 考慮到您的compare
調用正常工作並輸出了問題中的文本,那么這應該按照您的要求進行:
var=$( compare [...] | perl -ne 'print $1 if /all: (\d+)/' )
echo $var
如果不能保證數字前的空格,也可以使用/all:\\s*(\\d+)/
類的變體。
此處使用的Perl代碼主要基於-n
標志,該標志假定程序周圍存在以下循環:
while (<>) {
# ...
}
該循環逐行循環遍歷輸入,並且<>
已經假定輸入為標准輸入或作為參數指定的文件名。
-e
標志位於代碼本身之前:
print $1 if /all: (\d+)/;
這只是以下內容的簡寫:
if (/all: (\d+)/) {
print $1;
}
此處,匹配運算符m//
(或簡稱為/<regex>
)測試默認變量$_
以查看該正則表達式是否匹配。 誰設置了$_
變量? 循環本身在其(<>)
構造中。 它會自動為每個要讀取的行設置$_
。
如果正則表達式匹配,我們將打印它的第一組括號(組),其內容設置為$1
。 如果正則表達式具有其他組,則它們將存儲在$2
, $3
等中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.