的bash:如何从一个数组基于图案删除元素 [英] bash: how to delete elements from an array based on a pattern

查看:142
本文介绍了的bash:如何从一个数组基于图案删除元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

说我有一个bash阵列(例如,所有参数的数组),你想删除匹配特定模式的所有参数或替代所有剩余的元素复制到一个新的数组。或者,反过来,保持与模式匹配的元素。

为了说明一个例子:

  X =(preffoo酒吧foo的prefbaz巴兹prefbar)

和我想为了得到删除一切开始 preF

  Y =(巴富巴兹)

(顺序是不相关的)

如果我想同样的事情用空格分隔单词的列表?

  X =preffoo酒吧foo的prefbaz巴兹prefbar

和再次删除一切开始 preF ,以获得

  Y =巴富巴兹


解决方案

要剥离的扁带(绿巨人已经给出了阵列的答案),你可以打开 extglob shell选项并运行以下扩展

  $禁用了javascript -s extglob
$未设置点¯x
$ X =preffoo酒吧foo的prefbaz巴兹prefbar
$回声$ {X // preF *([^])?()}
巴富巴兹

extglob 选项所需 *(模式列表)? (模式列表)的形式。这使您可以(以不同的形式,以最普通的前pressions虽然)使用常规的前pressions而不只是路径扩展( *?[)。

这是绿巨人已经数组给出的答案将在阵列才起作用。如果设备出现在平坦的字符串的工作,它唯一的,因为在测试阵列是不是取消设置第一。

例如

  $ X =(preffoo酒吧foo的prefbaz巴兹prefbar)
$回声$ {X [@] // preF * /}
巴富巴兹
$ X =preffoo酒吧foo的prefbaz巴兹prefbar
$回声$ {X [@] // preF * /}
巴富巴兹
$未设置点¯x
$ X =preffoo酒吧foo的prefbaz巴兹prefbar
$回声$ {X [@] // preF * /}$

Say I have a bash array (e.g. the array of all parameters) and want to delete all parameters matching a certain pattern or alternatively copy all remaining elements to a new array. Alternatively, the other way round, keep elements matching a pattern.

An example for illustration:

x=(preffoo bar foo prefbaz baz prefbar)

and I want to delete everything starting with pref in order to get

y=(bar foo baz)

(the order is not relevant)

What if I want the same thing for a list of words separated by whitespace?

x="preffoo bar foo prefbaz baz prefbar"

and again delete everything starting with pref in order to get

y="bar foo baz"

解决方案

To strip a flat string (Hulk has already given the answer for arrays), you can turn on the extglob shell option and run the following expansion

$ shopt -s extglob
$ unset x
$ x="preffoo bar foo prefbaz baz prefbar"
$ echo ${x//pref*([^ ])?( )}
bar foo baz

The extglob option is needed for the *(pattern-list) and ?(pattern-list) forms. This allows you to use regular expressions (although in a different form to most regular expressions) instead of just pathname expansion (*?[).

The answer that Hulk has given for arrays will work only on arrays. If it appears to work on flat strings, its only because in testing the array was not unset first.

e.g.

$ 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*/}

$

这篇关于的bash:如何从一个数组基于图案删除元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆