【问题标题】:Split strings by a certain delimiter and extract the output for further processing按特定分隔符拆分字符串并提取输出以进行进一步处理
【发布时间】:2021-05-28 13:00:08
【问题描述】:

我有一个目录名称列表(每个都在一行中),其中包含 ruby​​gem 的名称及其版本。

我想在字符串的最后一个连字符处拆分它们。

文件夹名称字符串由

  • 宝石的名字
  • 并作为版本号的第二部分

如何同时提取用于进一步处理和

  • 保持 gem-name 和已建立的版本号之间的关系?

给定find 返回的列表

find . -type d -regextype posix-extended -regex "^./[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$"

我的方法是嵌套数组,像这样

declare -A my_gems
my_gems[gem_name]=()
# append version numbers to the right hand side array

我需要在将用户参数解析为包含 gem_name 和版本列表的脚本的上下文中进一步处理它...

谢谢

【问题讨论】:

  • find ... | while IFS=- read -ra name version; do my_gems["$name"]="$version"; done
  • 但我认为不可能将数组 $version 分配给哈希 $my_gems
  • 不确定我是否遵循您的要求。 IFSfolder-version 拆分为名称和版本。
  • 我的意思是我认为declare -A my_gems=() 是不可能的。 IE。将普通数组作为关联数组的值。祝你好运!
  • 可以用进程替换< <(find ...)

标签: bash split


【解决方案1】:

whileread 循环方法应该类似于。

#!/usr/bin/env bash

declare -A my_gems
find . -type d -regextype posix-extended -regex "^./[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$" | {
  while IFS= read -r line; do
    line=${line#*./}
    my_gems[${line%-*}]=${line##*-}
  done
}

declare -p my_gems

正如@oguz 建议的那样,使用Process Substitution

#!/usr/bin/env bash

declare -A my_gems

while IFS= read -r line; do
  line=${line#*./}
  my_gems[${line%-*}]=${line##*-}
done < <(find . -type d -regextype posix-extended -regex "^./[a-zA-Z0-9]+([-_]?[a-zA-Z0-9]+)*-[0-9]{1,3}(.[0-9]{1,3}){,3}\$")

declare -p my_gems

【讨论】:

  • 看起来应该可以。是否可以稍作修改?在文件名的最后一个连字符(“-”)处如何拆分?
  • @von 它出现在第一个连字符处。
  • @oguzismail,感谢您的意见。相应更新。
  • @vonspotz 是的,那里有一个错字,应该是 done &lt; &lt;( 而不是 done &lt;(
  • 非常感谢你们两位的努力!我还在学习,很高兴看到 SO 上的人不看不起新手。最美好的祝愿!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多