我有一個變數,其內容如下
----- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------------------------------|---------|----------|---------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- All files | 36.95 | 20.87 | 24.
PS:我提到的輸出實際上很長,為了在此處發布,我對其進行了修剪。我通過反復試驗發現所有檔案 <> | 在位置 970-990 之間
我正在嘗試提取與所有檔案關聯的值,即 36.95。我可以使用 cut 來獲取這樣的子字串
TOTAL="$(cut -c 975-990 <<< $RES)"
但我正在尋找更好的方法,例如使用正則運算式模式,我看到了像 grep 和 awk 這樣的模式,但我無法制定它。
uj5u.com熱心網友回復:
既然你提到了它 - 這里有一個awk替代方案:
total=$(awk -F'|' '{print $12}'<<<"${res}")
注意:所有大寫的變數名(按照慣例比任何東西都多)為系統保留。
uj5u.com熱心網友回復:
我不相信你的RES變數內容都在 1 行,我認為你通過使用echo $RES而不是echo "$RES"讓它看起來像這樣,它真正包含的內容看起來更像:
$ echo "$RES"
----------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|------------------
All files | 36.95 | 20.87 | 24.
在這種情況下,您只需要:
$ echo "$RES" | awk -F' *[|] *' '/All files/{print $2}'
36.95
uj5u.com熱心網友回復:
如果您不將自己限制在cut,這是一個可能的答案,它使用sed查找All files | ... |模式并從那里獲取文本。
TOTAL="$(sed -E 's/^.* All files \| ([^ ] ) \| .*$/\1/' <<< $RES)"
這是一個使用該想法的小腳本:
#!/bin/bash
RES="----- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------------------------------|---------|----------|---------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- All files | 36.95 | 20.87 | 24."
TOTAL="$(sed -E 's/^.* All files \| ([^ ] ) \| .*$/\1/' <<< $RES)"
echo "$TOTAL"
運行:
$ ./test.sh
36.95
uj5u.com熱心網友回復:
由于RES是一個 shell 變數,你可以這樣做:
TOTAL="${RES#*All Files}"
TOTAL="${TOTAL#*|}"
TOTAL="${TOTAL%|*}"
TOTAL="${TOTAL// /}"
- 第一行洗掉所有檔案,包括所有檔案
- 由于不確定單詞 All Files 后面有多少空格,我們再次洗掉第一個 <pipe> 字符之前的所有內容
- 最后,我們洗掉第一個 <pipe> 字符之后的所有內容。
- 作為最后一步,我們洗掉所有空格
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494302.html
