我有一个输出以下内容的 bash 脚本:
SUM = 137892134.0000000
我需要去掉字符串的第一部分,只留下数字,如果可能的话,格式化为整数。我假设我需要使用sed
,但我似乎学习它的能力为零。
我需要能够编写一个条件语句,如果值小于 100 则可以操作。我不知道我是否可以在 bash 脚本中执行此操作,但这将是我挑战的第二部分。
使用 sed 进行替换的基本形式是:
s/replace this/with this/
其中“replace this”和“with this”都是正则表达式。在您的情况下,您希望完全摆脱开头的文字字符串“SUM =”和结尾的小数。所以:
#!/bin/bash
sum=$(your_script.sh | sed 's/^SUM = //' | sed 's/\..*//')
if ! egrep -q '^[0-9]+$' <<< $sum; then
echo "your_script.sh printed unexpected output!"
exit 1
fi
if [ $sum -lt 100 ]; then
echo "$sum is less than 100"
else
echo "$sum is not less than 100"
fi
第一行是将“SUM = 137892134.0000000”变成“137892134”。第一个 sed 将字符串 ( ) 开头的 "SUM = " 替换为空^
内容(即删除它)。第二个 sed 找到第一个句点字符 ( \.
) 并将它和它之后的所有内容 ( .*
) 替换为空。然后将生成的字符串保存到使用的变量$sum
中$(...)
。
使用 egrep 的 if 语句正在检查以确保我们保存的值$sum
实际上是一个整数,如果不是,则放弃。
第二个 if 语句将 $sum 的值(我们现在知道它是一个整数)与 100 进行比较。
我不清楚您想如何处理“123.789”(打印为整数时是打印 124 还是 123)。考虑:
if $( echo SUM = 137892134.0000000 | awk '{printf "%d", $3}' ) -lt 100; then
echo the value is less than 100!!
fi
你也可以这样做:
if echo SUM = 137892134.0000000 | awk '$3 >= 100 { exit 1}'; then
echo the value is less than 100!!
fi
或者
if ! echo SUM = 137892134.0000000 | awk '{exit $3 < 100}'; then
echo the value is less than 100!!
fi
请注意,由于返回 1 的计算结果为失败,因此逻辑有点复杂awk
,因此比较运算符与预期相反。
这是sed
执行此操作的一种方法:
echo 'SUM = 137892134.0000000' | sed 's/[^0-9.]//g' | sed 's/\..*//g'
输出应该是这样的:137892134
.
关于命令的一些解释:
sed 's/[^0-9.]//g'
告诉sed
删除任何不是数字 ( 0
- 9
) 或句点 ( .
)的字符
sed 's/\..*//g'
告诉sed
删除.*
小数点 ( ) 后的所有字符 ( \.
)
此外,echo
您可以将原始脚本的输出用于第一部分,而不是使用,然后可以通过管道将其输入sed
以最终获得您想要的最终“int”。
注意:这没有考虑William Pursell 提出的任何舍入问题。
我建议:
bashScript | sed 's/.* \(.*\)\.0*/\1/'
用英语:“取一堆东西,然后是一个空格,然后是某物,然后是一个点,也许还有一些零,然后用某物替换所有这些。”