从 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")