我想編寫一個腳本,執行以下操作: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