我有一个保存版本的文本文件:
1.0
2.0
3.0
4.0
5.0
等等。
例如,我需要一种方法来给出4.0
作为输入并获取3.0
作为输出。请注意,会有数千个版本。
我的意思是我想给出一个版本号并获取以前版本的编号。所以如果我给予9.0
,我就会得到8.0
。
我试过
sed '1!G;h;$!d' test.txt
但这正在打印所有数字。
答案1
你可以用bc
(参见GNU BC 手册)。您可以传递bc
算术表达式并bc
对其求值并返回结果,例如
echo '9.0 - 1' | bc -l
该命令返回8.0
其结果。
现在假设您的版本号包含在文件中version.txt
,例如:
echo '9.0' > version.txt
然后你可以运行以下命令:
echo "$(cat version.txt) - 1" | bc -l
这将8.0
作为其输出产生。或者,假设您在名为例如的文件中有一个版本号列表versions.txt
:
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0
我们可以像这样创建这样的文件:
for i in {1..10}; do echo "${i}.0" >> versions.txt; done
在这种情况下,我们可以bc
在 while 循环内部使用:
while read line; do echo "${line}-1" | bc -l; done < versions.txt
这会产生以下输出:
0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
或者,您可以从版本号中提取整数部分并用于bash
执行算术。您可以使用任意数量的文本处理工具来执行此操作(例如grep
,sed
,awk
, 等)。这是使用该命令的示例cut
:
echo "$(( $(echo '9.0' | cut -d. -f1) - 1)).0"
这将8.0
作为其输出。将其放入 while 循环中可以得到以下结果:
while read line; do \
echo "$(( $(echo ${line} | cut -d. -f1) - 1)).0";
done < versions.txt