【问题标题】:bash: how to compare strings with nums and letters?bash:如何将字符串与数字和字母进行比较?
【发布时间】:2017-11-13 20:32:04
【问题描述】:

我有一个包含 1617b、1516a 等元素的数组。我想以降序回显元素 - 表示其中字符数最多的元素,如果相同,则表示字母更大的元素。关于如何做到这一点的任何想法?一个简单的“如果”会起作用吗?如:

if [[ ${array[$j]}>${array[$j+1]} ]]; then
     .
     .
     .

tnx 提前

【问题讨论】:

  • 我建议删除所有尾随字母:echo "${array[$j]/[a-z]*/}"
  • 是的,但我在比较时仍然需要检查字母。我想我可以使用 cut (总是有 4 个数字,然后是一个字母)。但是那我如何比较字母呢?例如,shell 是否知道 B 比 A 大?
  • 如果总是有 4 个数字和 1 个字母,词典比较应该可以正常工作,您不需要将其拆分为数字和字母。
  • 您可以使用sort 命令,而不是比较bash 中的字符串。
  • 什么是字典比较?抱歉,我是 bash 新手

标签: string bash compare


【解决方案1】:

这是一种方法

$ ar=(1234a 2345b 1234c 4444d)
$ sorted=$(printf "%s\n" ${ar[@]} | sort | xargs)
$ echo $sorted

1234a 1234c 2345b 4444d

对于降序添加-r标志到sort

如果您希望将排序后的值返回到数组中

$ sorted_ar=($(printf "%s\n" ${ar[@]} | sort))
$ echo ${sorted_ar[@]}

【讨论】:

  • xargs 这里的目的是什么?不应该是sorted=($(...))(带有额外的括号)吗?
  • 是的,第一个输出不是数组,因此要将值序列化到与xargs 相同的行。添加了将值转换回数组的第二个选项,其中不需要并添加了 xargs
  • 哦,我现在明白了:它是删除换行符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多