从bash中的字符串中删除指定的字符串模式

时间:2017-02-16 14:53:49

标签: bash glob

我发现了一个很好的answer,它解释了如何从字符串变量中删除指定的模式。在这种情况下,要删除“foo”'我们使用以下内容:

string="fooSTUFF"
string="${string#foo}"

但是,我想添加" OR"功能可以删除' foo'或者' boo'在我的字符串以其中任何一个开头的情况下,并保持字符串不变,如果它不是以' foo'或者' boo'。因此,修改后的脚本看起来应该是这样的:

string="fooSTUFF"
string="${string#(foo OR boo)}"

如何正确实施?

3 个答案:

答案 0 :(得分:3)

如果您使用

设置了extglob(扩展的glob)shell选项
shopt -s extglob

然后你可以写:

string="${string#@(foo|boo)}"

扩展模式记录在bash manual;他们采取以下形式:

  • ?(pattern-list):匹配给定模式的零次或一次。

  • *(pattern-list):匹配给定模式的零次或多次。

  • +(pattern-list):匹配给定模式的一个或多个匹配项。

  • @(pattern-list):匹配其中一个给定的模式。

  • !(pattern-list):匹配除了一个给定模式之外的任何内容。

在所有情况下,pattern-list是由 | 分隔的模式列表

答案 1 :(得分:2)

您需要extended glob pattern(使用shopt -s extglob启用):

$ str1=fooSTUFF
$ str2=booSTUFF
$ str3=barSTUFF
$ echo "${str1#@(foo|boo)}"
STUFF
$ echo "${str2#@(foo|boo)}"
STUFF
$ echo "${str3#@(foo|boo)}"
barSTUFF

@(pat1|pat2)匹配由|分隔的其中一种模式。

@(pat1|pat2)是您问题的一般解决方案(多种模式);在一些简单的情况下,你可以在没有扩展的情况下离开:

echo "${str#[fb]oo}"

也适用于您的具体示例。

答案 2 :(得分:-1)

您可以使用:

string=$(echo $string | tr -d "foo|boo")