从 bash 中的字符串中删除指定的字符串模式
Remove specified string pattern(s) from a string in bash
我找到了一个很好的 answer,它解释了如何从字符串变量中删除指定的模式。在这种情况下,要删除 'foo' 我们使用以下内容:
string="fooSTUFF"
string="${string#foo}"
但是,我想添加 "OR" 功能,在我的字符串以其中任何一个开头的情况下能够删除 'foo' 或 'boo',然后离开如果字符串不是以 'foo' 或 'boo' 开头,则字符串保持原样。所以,修改后的脚本应该是这样的:
string="fooSTUFF"
string="${string#(foo OR boo)}"
如何正确实施?
如果您已将 extglob
(扩展 glob)shell 选项设置为
shopt -s extglob
那你可以这样写:
string="${string#@(foo|boo)}"
扩展模式记录在 bash manual;它们采用以下形式:
?(pattern-list)
:匹配给定模式的零次或一次出现。
*(pattern-list)
:匹配给定模式的零次或多次出现。
+(pattern-list)
:匹配给定模式的一次或多次出现。
@(pattern-list)
:匹配给定模式之一。
!(pattern-list)
:匹配除给定模式之一以外的任何内容。
在所有情况下,pattern-list
都是由 |
分隔的模式列表
为此你需要一个 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)
是您问题的一般解决方案(多种模式);在一些简单的情况下,你可以在没有扩展 globs 的情况下逃脱:
echo "${str#[fb]oo}"
也适用于您的特定示例。
您可以使用:
string=$(echo $string | tr -d "foo|boo")
我找到了一个很好的 answer,它解释了如何从字符串变量中删除指定的模式。在这种情况下,要删除 'foo' 我们使用以下内容:
string="fooSTUFF"
string="${string#foo}"
但是,我想添加 "OR" 功能,在我的字符串以其中任何一个开头的情况下能够删除 'foo' 或 'boo',然后离开如果字符串不是以 'foo' 或 'boo' 开头,则字符串保持原样。所以,修改后的脚本应该是这样的:
string="fooSTUFF"
string="${string#(foo OR boo)}"
如何正确实施?
如果您已将 extglob
(扩展 glob)shell 选项设置为
shopt -s extglob
那你可以这样写:
string="${string#@(foo|boo)}"
扩展模式记录在 bash manual;它们采用以下形式:
?(pattern-list)
:匹配给定模式的零次或一次出现。*(pattern-list)
:匹配给定模式的零次或多次出现。+(pattern-list)
:匹配给定模式的一次或多次出现。@(pattern-list)
:匹配给定模式之一。!(pattern-list)
:匹配除给定模式之一以外的任何内容。
在所有情况下,pattern-list
都是由 |
为此你需要一个 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)
是您问题的一般解决方案(多种模式);在一些简单的情况下,你可以在没有扩展 globs 的情况下逃脱:
echo "${str#[fb]oo}"
也适用于您的特定示例。
您可以使用:
string=$(echo $string | tr -d "foo|boo")