【问题标题】:How to extract numerical value from array of string in bash如何从bash中的字符串数组中提取数值
【发布时间】:2023-02-10 18:25:54
【问题描述】:

如果数组 = ["stack","overflow","5","6","question","9"]

我想制作另一个数组来存储所有数值,例如: new_arr = [5,6,9] in bash

【问题讨论】:

  • 请问这个数组是从哪里来的?
  • 如果给出了字符串数组,我们如何使用 bash 从中提取整数
  • bash 数组中没有逗号或方括号。你能显示实际代码吗?
  • 请更新问题以显示您到目前为止尝试过的 (bash) 代码以及您的代码生成的(错误)输出
  • @KAVITASINGH 你有没有计划更新你的问题以显示带有字符串数组的真实代码?

标签: javascript json linux bash scripting


【解决方案1】:

bash 中,您可以这样做:

# declare original array
arr=("stack" "overflow" "5" "6" "question" "9")

# remove all elements that have at least one non-digit character
narr=(${arr[@]//*[!0-9]*})

# check content of narr
declare -p narr

输出:

declare -a narr='([0]="5" [1]="6" [2]="9")'

【讨论】:

  • 这不是 OP 询问的输入
【解决方案2】:

在带有 cmets 内联的纯 bash 中:

#!/bin/bash

# the initial array
array=( "stack" "overflow" "5" "6" "question" "9" )

# declare the final array
declare -a new_arr

# loop over the original values
for val in "${array[@]}"
do
    # use regex to filter out those with only digits
    if [[ $val =~ ^[0-9]+$ ]];
    then
        # and append them to new_arr
        new_arr+=($val)
    fi
done

# print the result
for val in "${new_arr[@]}"
do
    echo $val
done

如果 array 是标量

array='["stack","overflow","5","6","question","9"]'

你应该使用解析器。 用于通用流编辑, 是专门用于处理 JSON 数据的解析器。

这里 jq 用于仅选择那些包含至少 1 个字符且所有字符必须是数字的值,使用 ^[0-9]+$

readarray new_arr < <(echo "$array" | jq -r '.[] | select(test("^[0-9]+$"))')

【讨论】:

  • 这不是用户输入
  • @GillesQuenot 对不起,但我不明白。我创建的数组是否包含与 OP 显示的相同的元素?编辑:啊哈,你是说 OP 把它误认为是标量?
  • @GillesQuenot 足够公平。 :-) 我看到这个问题已经在问题下提出了。如果输入确实是 OP 显示的内容并且没有错误,我将修改我的答案。
  • @GillesQuenot 似乎 OP 没有进一步澄清就放弃了这个,但我在答案中添加了 jq 版本。
【解决方案3】:

使用 for 循环,您将能够遍历数组,然后通过 this post 获得灵感来确定迭代器的值是数字还是字符串。

如果是数值,只需将其附加到另一个数组即可。

【讨论】:

  • 这应该属于评论
  • 我认为这是边界。从技术上讲,它可以作为问题的答案“如何从bash中的字符串数组中提取数值” 因为它用文字解释了需要做什么,但我真的怀疑如果不点击链接它会对提问者有帮助。我假设提问者想要代码。
  • so & co 上规则很明确,复制代码可以提供链接。链接可能已经死了...
【解决方案4】:

正确输入的正确工具:

array = ["stack","overflow","5","6","question","9"]
#!/bin/bash

arr=( $(
    node<<EOF
    new_arr = ["stack","overflow","5","6","question","9"]
    .filter(e => e.match(/^d+$/));
    new_arr.forEach(e => console.log(e))
EOF
)) 
printf '%s
' "${arr[@]}" # plain bash array

在线测试

new_arr = ["stack","overflow","5","6","question","9"]
.filter(e => e.match(/^d+$/));
new_arr.forEach(e => console.log(e))

【讨论】:

  • 我们如何在 bash 中做???
  • 现在使用bash 或其他 shell ;)
  • 这不在 bash 中,您的解决方案仍然基于 nodejs....
  • 是的,外壳是协调器使用第三方工具,就像这里:nodejsperlsedawk也是一样,这些是bash可以调用的二进制文件
  • 我没有得到反对票。这是一个赞成票:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2011-04-03
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多