我想编写一个脚本,执行以下操作:grep的两个整数,并比较他们
- 给定一个字符串,它看起来像这样“有5个苹果,3个橘子”
- 提取两个整数(5,3)
- 比较他们
我所做的提取部分。
NUM=echo $String | grep -o "[0-9]\+"
但NUM将是这样的:
5
3
\n
我试图${NUM[0]}
和${NUM[@]}
刚刚拿到的第一个值,但它不工作。
有什么建议吗?
我想编写一个脚本,执行以下操作:grep的两个整数,并比较他们
我所做的提取部分。
NUM=echo $String | grep -o "[0-9]\+"
但NUM将是这样的:
5
3
\n
我试图${NUM[0]}
和${NUM[@]}
刚刚拿到的第一个值,但它不工作。
有什么建议吗?
您分配给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]+'))
如果字符串是变量或命令怎么办? –
@AlbertYip我用这些案例的例子更新了我的答案。 – janos
我将与进程替换和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或更高版本。
与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的值应该是,提供了一个正则表达式 一个字符串。这个正则表达式描述了每个 字段的内容。
对,非常感谢。 – tso
随着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
请看一看:?当有人回答我的问题,我应该怎么办(http://stackoverflow.com/help/someone-answers ) – Cyrus