Wildcards

這個 glob 表達式如何刪除冒號?

  • November 6, 2022

假設我們有一個名為“Hello World:最簡單的程序”的文件,它的名稱保存在一個名為“title”的變數中。

我想將此與 glob 模式匹配匹配,但刪除冒號。換句話說,我希望它匹配“Hello World 最簡單的程序”

我發現您可以使用以下方法執行此操作:

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

它有效,但我不明白為什麼。

我知道“|” 是 OR,所以對我來說它看起來像匹配“ $ {/:/}" or " $ { $ {title}}" or " $ {}”,其中沒有一個看起來像是在刪除冒號。

所以我的問題是:上面的 glob 模式匹配表達式如何/為什麼從標題中刪除冒號?

編輯:我應該提到我正在使用的外殼是 Steam ROM 管理器。看來我弄錯了,它不是一個 glob 表達式,而是一個 Steam ROM Parser 函式變數,可以選擇使用 glob 語法(代替預設的正則表達式語法)。感謝 Steeldiver 和 ilkkachu!

在 bash 中,假設您有title="Hello World: The easiest program",如果您像這樣使用參數擴展

echo ${title/:/}

它會列印出來

Hello World The easiest program

${title/:/}說“取參數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

您問題中的表達式不是glob 表達式,它顯然是一個Steam ROM Parser 函式變數可以選擇使用 glob 語法(代替預設的正則表達式語法)進行模式匹配序列。

表達式的形式為

${/pattern/|input|}

具有pattern等於:input等於變數擴展${title}。在這種情況下|被理解為一種三元條件

|on match|no match(optional)

所以${/:/|${title}|}意味著匹配 in 的:出現${title}並將它們替換為空。

請注意,由於:在 shell glob 或正則表達式語法中都不是特殊的,所以實際上是否設置了Parser Typetoglob或其他方式並不重要。

引用自:https://unix.stackexchange.com/questions/723792