说我有一个bash数组(例如所有参数的数组),并想删除匹配某个模式的所有参数,或者将所有剩余的元素复制到一个新的数组.或者,另一方面,保持元素匹配模式.
举例说明:
- x=(preffoo bar foo prefbaz baz prefbar)
我想删除所有以pref开头的东西,以获得
- y=(bar foo baz)
(订单不相关)
如果我想要一个由空白分隔的单词列表的同样的东西怎么办?
- x="preffoo bar foo prefbaz baz prefbar"
- y="bar foo baz"
要剥去一个平面字符串(绿巨人已经给出了数组的答案),可以打开extglob shell选项并运行以下扩展
- $shopt -s extglob
- $unset x
- $x="preffoo bar foo prefbaz baz prefbar"
- $echo ${x//pref*([^ ])?( )}
- bar foo baz
*(pattern-list)和?(pattern-list)形式需要extglob选项.这允许您使用正则表达式(尽管与大多数正则表达式不同),而不仅仅是路径名扩展(*?[]).
Hulk给数组的答案只能在数组上运行.如果它似乎在平面字符串上工作,它只是因为在测试数组时没有首先设置.
例如
- $x=(preffoo bar foo prefbaz baz prefbar)
- $echo ${x[@]//pref*/}
- bar foo baz
- $x="preffoo bar foo prefbaz baz prefbar"
- $echo ${x[@]//pref*/}
- bar foo baz
- $unset x
- $x="preffoo bar foo prefbaz baz prefbar"
- $echo ${x[@]//pref*/}
- $