2017-06-16 83 views
0

我想编写一个脚本,执行以下操作:grep的两个整数,并比较他们

  1. 给定一个字符串,它看起来像这样“有5个苹果,3个橘子”
  2. 提取两个整数(5,3)
  3. 比较他们

我所做的提取部分。

NUM=echo $String | grep -o "[0-9]\+" 

但NUM将是这样的:

5 
3 
\n 

我试图${NUM[0]}${NUM[@]}刚刚拿到的第一个值,但它不工作。

有什么建议吗?

+0

请看一看:?当有人回答我的问题,我应该怎么办(http://stackoverflow.com/help/someone-answers ) – Cyrus

回答

0

您分配给NUM的方式不正确。 你的帖子中的grep模式也是如此。 这样写:

input='There are 5 apples and 3 oranges' 
nums=($(grep -Eo '[0-9]+' <<< "$input")) 

${nums[0]}将包含第一个数字,${nums[1]}第2,依此类推。

如果输入来自一个命令:

nums=($(cmd | grep -Eo '[0-9]+')) 
+0

如果字符串是变量或命令怎么办? –

+0

@AlbertYip我用这些案例的例子更新了我的答案。 – janos

0

我将与进程替换和mapfile做到这一点:

$ mapfile -t nums < <(grep -Eo '[[:digit:]]+' <<< 'There are 5 apples and 3 oranges') 
$ declare -p nums 
declare -a nums='([0]="5" [1]="3")' 

这可以确保只有换行符单独的数组元素。在这种情况下,这不会成为问题,因为搜索条件是数字序列,但它是一种适用于任何模式的稳健方法。

请注意,mapfile需要Bash 4.0或更高版本。

0

GNU awk

gawk '{if($1>$2){print $1">"$2}else if($1<$2){print $1"<"$2} else {print $1"="$2}}' FPAT='[0-9]+' <<<'There are 5 apples and 8 oranges' 

FPAT的值应该是,提供了一个正则表达式 一个字符串。这个正则表达式描述了每个 字段的内容。

+1

对,非常感谢。 – tso

0

随着GNU AWK为FPAT:

$ echo 'There are 5 apples and 3 oranges' | 
    awk -v FPAT='[0-9]+' '{print ($1 > $2 ? "greater" : "lesser")}' 
greater 
$ echo 'There are 2 apples and 3 oranges' | 
    awk -v FPAT='[0-9]+' '{print ($1 > $2 ? "greater" : "lesser")}' 
lesser