这个 glob 表达式如何删除冒号?

这个 glob 表达式如何删除冒号?

假设我们有一个名为“Hello World:最简单的程序”的文件,其名称保存在名为“title”的变量中。

我想将其与全局模式匹配相匹配,但删除冒号。换句话说,我希望它匹配“Hello World 最简单的程序”

我发现你可以使用以下方法来做到这一点:

${/:/|${title}|}

它有效,但我不明白为什么。

我知道“|”是 OR,所以对我来说它看起来匹配“${/:/}”或“${${title}}”或“${}”,其中没有一个看起来像是在删除冒号。

所以我的问题是:上面的全局模式匹配表达式如何/为什么从标题中删除冒号?

编辑:我应该提到我正在使用的 shell 是 Steam ROM 管理器。看来我错了,它不是一个 glob 表达式,而是一个 Steam ROM 解析器函数变量,可以选择使用 glob 语法(代替默认的正则表达式语法)。感谢 Steeldiver 和 ilkkachu!

答案1

你问题中的表达不是全局表达式,这显然是一个Steam ROM 解析器函数变量可选地使用 glob 语法(代替默认的正则表达式语法)作为其模式匹配序列。

表达式的形式为

${/pattern/|input|}

等于和pattern等于变量扩展。在这种情况下应被理解为一种三元条件:input${title}|

|on match|no match(optional)

so${/:/|${title}|}表示匹配出现的:in${title}并将其替换为空。

请注意,由于在 shell glob 或正则表达式语法中都不是特殊的,因此无论您将其设置为还是其他形式:,实际上都不重要。Parser Typeglob

答案2

在 bash 中,假设你有title="Hello World: The easiest program",如果你使用参数扩展像这样:

echo ${title/:/}

它将打印出来

Hello World The easiest program

${title/:/}说“取参数标题,但第一次有‘:’,sub在‘’里。” (也就是说,什么都没有)

如果您使用额外的 /,如下所示:${title//:/}它将替换所有它们。

title="Hello World: The easiest:::::: program"
echo ${title//:/}
Hello World The easiest program

有了明显的替代:

title="Hello World: The easiest:::::: program"
echo ${title//:/*}
Hello World* The easiest****** program

相关内容