我发现了一个很好的answer,它解释了如何从字符串变量中删除指定的模式。在这种情况下,要删除“foo”'我们使用以下内容:
string="fooSTUFF"
string="${string#foo}"
但是,我想添加" OR"功能可以删除' foo'或者' boo'在我的字符串以其中任何一个开头的情况下,并保持字符串不变,如果它不是以' foo'或者' boo'。因此,修改后的脚本看起来应该是这样的:
string="fooSTUFF"
string="${string#(foo OR boo)}"
如何正确实施?
答案 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")