這個 glob 表達式如何刪除冒號?
假設我們有一個名為“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 Type
toglob
或其他方式並不重要。