我有一个可行的解决方案,但它不适合公开使用。文件";txt版本";既是远程的,也是本地的。区别在于数字:
远程:
17 March 2022
FVWM myExtensions ver. 3.1.4
本地:
15 March 2022
FVWM myExtensions ver. 3.1.1
在我的";"差";解决方案我手动将行改为一行,让awk找到最后一列,并删除数字之间的点。这两个结果都作为变量。
awk '{print $NF}' download/version.txt > tmpGit.txt
VARgit=`sed 's|[.]||g' tmpGit.txt`
awk '{print $NF}' ~/.fvwm/version.txt > tmpLocal.txt
VARlocal=`sed 's|[.]||g' tmpLocal.txt`
if [ "$VARgit" -gt "$VARlocal" ]; then
echo "New update available.";
else
echo "No update.";
fi
我还没有找到在文本行中查找数字并比较多个点号的解决方案。提前谢谢。
您可以使用grep
执行此操作,例如:
IFS=. read rmajor rminor rpatch < <(grep -oE '[0-9]+.[0-9]+.[0-9]+' remote.txt)
IFS=. read lmajor lminor lpatch < <(grep -oE '[0-9]+.[0-9]+.[0-9]+' local.txt)
[ $rmajor -gt $lmajor ] && echo "New major version"
[ $rminor -gt $lminor ] && echo "New minor version"
[ $rpatch -gt $lpatch ] && echo "New patchlevel"
编辑
因此,为了测试remote.txt
是否包含更新的版本,假设所有版本项都是数字的,类似这样的操作有效:
if [ $rmajor -gt $lmajor ]; then
echo "New major version"
elif [ $rmajor -eq $lmajor -a $rminor -gt $lminor ]; then
echo "New minor version"
elif [ $rmajor -eq $lmajor -a $rminor -eq $lminor -a $rpatch -gt $lpatch ]; then
echo "New patchlevel"
else
echo "Remote has same version or older."
fi
使用GNU排序进行版本排序:
$ awk -v OFS='t' '/FVWM/{print $NF, FILENAME}' local remote | sort -k1,1Vr
3.1.4 remote
3.1.1 local
这将按降序告诉您版本号和包含每个版本号的文件名。
以上是在这些输入文件上运行的:
$ head local remote
==> local <==
15 March 2022
FVWM myExtensions ver. 3.1.1
==> remote <==
17 March 2022
FVWM myExtensions ver. 3.1.4
鉴于以上情况,如果2个不同,这将打印包含最高版本号的文件名,否则不打印:
$ awk -v OFS='t' '/FVWM/{print $NF, FILENAME}' local remote |
sort -k1,1Vr |
awk '
{ vers[NR]=$1; files[NR]=$0; sub(/[^t]+t/,"",files[NR]) }
END{ if ( vers[1] != vers[2] ) print files[1] }
'
remote
因此,您可以测试这是否是远程文件名,如果是,请下载。
在文本行中查找数字
使用正则表达式很容易做到这一点,例如使用GNUAWK
,让file.txt
内容为
17 March 2022
FVWM myExtensions ver. 3.1.4
然后
awk 'BEGIN{FPAT="[0-9.]+[.][0-9.]+"}NF{print $1}' file.txt
输出
3.1.4
解释:我通知GNUAWK
,字段由1个或多个数字或点、文字点(因此[.]
而不是.
(、1个或更多数字或点组成。然后,如果给定行中存在一个或多个这样的字段,请打印第一个字段(此解决方案假设每行中最多有一个这样的域(
(在gawk 4.2.1中测试(
比较多个点号
我不知道这方面的现成解决方案,但我想注意的是,这项任务看起来可能很容易,但除非你能强制执行某些限制,否则就不是这样。在您的示例中,您有3.1.1
和3.1.4
,即所有元素都是<10
,因此如果您对字母排序的需求进行比较,您将得到预期的结果。考虑一下如果你有3.9
和3.11
会发生什么——后者会更早被考虑,因为第一个差异在第三个位置,而1
在字母表中比9
更早。如果您可以强制要求所有部分都由一个数字组成,则不会出现此问题。