2

我有一个输出以下内容的 bash 脚本:

SUM = 137892134.0000000

我需要去掉字符串的第一部分,只留下数字,如果可能的话,格式化为整数。我假设我需要使用sed,但我似乎学习它的能力为零。

我需要能够编写一个条件语句,如果值小于 100 则可以操作。我不知道我是否可以在 bash 脚本中执行此操作,但这将是我挑战的第二部分。

4

4 回答 4

2

使用 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 进行比较。

于 2013-03-15T18:03:03.830 回答
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

请注意,由于返回 1 的计算结果为失败,因此逻辑有点复杂awk,因此比较运算符与预期相反。

于 2013-03-15T18:20:48.843 回答
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 提出的任何舍入问题。

于 2013-03-15T17:59:05.987 回答
0

我建议:

bashScript | sed 's/.* \(.*\)\.0*/\1/'

用英语:“取一堆东西,然后是一个空格,然后是某物,然后是一个点,也许还有一些零,然后用某物替换所有这些。”

于 2013-03-15T18:05:35.383 回答