假设我们有一个名为“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 Type
glob
答案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