gpt4 book ai didi

bash - 仅使用 Bash 模式匹配从字符串开头删除模式

转载 作者:行者123 更新时间:2023-12-04 01:12:37 25 4
gpt4 key购买 nike

是否可以使用 Bash 的内置模式匹配和参数替换从字符串的开头删除模式? ( bash 5.0.18)

给定以下数组:

myparams=( --some-param -h --15 -q 100 )

我想遍历元素并输出以下内容(从前面去除所有 - 而不影响任何可能出现的元素)。期望的输出:

some-param
h
15
q
100

我知道 Bash Hackers Wiki - Substring removal但我没有看到任何方法可以做到这一点。

这是一次失败的尝试,几乎 成功了,但是 some- 被破坏了:

$ for p in "${myparams[@]}"; do echo "$p ==> ${p##*-}" ; done
--some-param ==> param
-h ==> h
--15 ==> 15
-q ==> q
100 ==> 100

又一次失败的尝试,这次some-param变成了someparam:

$ for p in "${myparams[@]}"; do echo "$p ==> ${p//-}" ; done
--some-param ==> someparam
-h ==> h
--15 ==> 15
-q ==> q
100 ==> 100

这是一个可行的解决方案,但它依赖于 sed(使用来自 macOS 10.15.7 的 sed 进行测试):

$ for p in "${myparams[@]}"; do echo "$p ==> $(sed 's/^-*//'<<<"$p")" ; done
--some-param ==> some-param
-h ==> h
--15 ==> 15
-q ==> q
100 ==> 100

最后,这是一个使用 BASH_REMATCH 的工作方法——这是唯一的内置方法吗?:

$ for p in "${myparams[@]}"; do [[ $p =~ ^(-*)?(.*) ]]; echo "$p ==> ${BASH_REMATCH[2]}" ; done
--some-param ==> some-param
-h ==> h
--15 ==> 15
-q ==> q
100 ==> 100

最佳答案

使用扩展模式和参数扩展:

shopt -s extglob
printf '%s\n' "${myparams[@]##+(-)}"
  • +(-) 匹配一个或多个破折号
  • # 只移除值开头的字符串
  • ## 匹配最长的字符串
  • 使用数组作为参数删除其所有成员的前缀

关于bash - 仅使用 Bash 模式匹配从字符串开头删除模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64361565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com