我正在嘗試參考https://github.com/Frugghi/iSSH2擁有自己的 bash 腳本來為蘋果平臺生成 libssl 和 libssh 庫。我想嘗試自己的 bash 腳本的原因是獲取最近的庫并保持更新。
我有兩個 bash 腳本來檢測最新版本的 openssl 和 libssh2 庫:
getLibssh2Version () {
if type git >/dev/null 2>&1; then
LIBSSH_VERSION=`git ls-remote --tags https://github.com/libssh2/libssh2.git | egrep "libssh2-[0-9] (\.[0-9])*[a-zA-Z]?$" | cut -f 2 -d - | sort -t . -r | head -n 1`
LIBSSH_AUTO=true
}
和
getOpensslVersion () {
if type git >/dev/null 2>&1; then
LIBSSL_VERSION=`git ls-remote --tags git://git.openssl.org/openssl.git | egrep "OpenSSL(_[0-9]) [a-zA-Z]?$" | cut -f 2,3,4 -d _ | sort -t _ -r | head -n 1 | tr _ .`
LIBSSL_AUTO=true
}
但是第一個腳本獲取 1.9.0 版本的 Libssh2 而不是 1.10.0 ,第二個腳本獲取 1.1.1n 系列的 OpenSSL 而不是 3.0.2 。我猜這與定義的正則運算式有關。有人可以解決這個腳本錯誤嗎?
uj5u.com熱心網友回復:
在您的第一個片段中:
- 您正在過濾您的
1.10.0版本egrep,(\.[0-9])*其中應該是(\.[0-9] )*. - 對于這些子版本的數字排序,
sort需要更多選項:-t. -k 1,1n -k 2,2n - 我已經切換到不進行反向排序,而是使用
tail而不是head,因為反向排序在某種程度上不適用于其他選項(至少在我的機器上)。
解決方案:
git ls-remote --tags https://github.com/libssh2/libssh2.git | \
egrep "libssh2-[0-9] (\.[0-9] )*[a-zA-Z]?$" | \
cut -f 2 -d - | sort -t. -k 1,1n -k 2,2n | tail -n 1
輸出:
1.10.0
在第二個片段中:
- 命名和標點符號從 1.x 更改為 3.x 版本,因此它們被 .x 過濾掉了
egrep。而不是egrep "OpenSSL(_[0-9]) [a-zA-Z]?$",我會天真地使用egrep -i "OpenSSL([_.-][0-9]) [a-zA-Z]?$". - 因此,對于較新版本,版本“提取”
cut失敗。我自然而然地選擇使用sed 's/.*openssl.//i'來做同樣的事情。 - 我再次從 using 切換
head到tail. - 請注意,
sorting 遇到與第一個片段相同的問題,即當這些子版本開始滾動時,例如 from3.9...to3.10...,您需要添加與上面相同的選項。
解決方案:
git ls-remote --tags git://git.openssl.org/openssl.git | \
egrep -i "OpenSSL([_.-][0-9]) [a-zA-Z]?$" | \
sed 's/.*openssl.//i' | sort -t _ | tail -n 1 | tr _ .
輸出:
3.0.2
uj5u.com熱心網友回復:
您需要 Perl 樣式的正則運算式匹配,它可以-oP選擇grep.
獲取libssh2最新版本。
git ls-remote --tags https://github.com/libssh2/libssh2.git | grep -oP "libssh2-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"
獲取openssl最新版本。
git ls-remote --tags git://git.openssl.org/openssl.git | grep -oP "openssl-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/461250.html
標籤:Python 正则表达式 grep openssl libssh2
上一篇:繼承了一些sed代碼,我知道它正在替換一些字符,但不是哪些字符。1,$s/*$//g
下一篇:如何在VGA記憶體中寫入換行符
