我有一个输出以下内容的bash脚本:
SUM = 137892134.0000000
我需要去除字符串的第一部分,只留下数字,如果可能的话,格式化为整数。我假设我需要使用sed
,但我似乎没有能力学习它。
我需要能够编写一个条件语句,如果值小于100就可以运行。我不知道我是否可以在bash脚本中执行此操作,但这将是我挑战的第二部分。
答案 0 :(得分:2)
sed替换的基本形式是:
s/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进行比较。
答案 1 :(得分:2)
我不清楚你想如何处理“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
请注意,逻辑有点复杂,因为awk
返回1计算为失败,因此比较运算符与预期的相反。
答案 2 :(得分:1)
以下是使用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提出的任何舍入问题。
答案 3 :(得分:0)
我建议:
bashScript | sed 's/.* \(.*\)\.0*/\1/'
在英语中:“取一堆东西后跟一个空格,然后是某些东西,然后是一个点,也许是一些零,并用替换所有这些“。