Zsh
使用 zsh,擦除不匹配的行但不刪除它們
如果我想刪除數組中不匹配的行,這很好用:
array=( ${(M)array:#*${filter}*} )
但是,它也會壓縮數組。但是我需要保持數組的長度相同,因為稍後我會將它與原始長度的另一個數組合併。也就是說,我想“清空”不匹配的行,但實際上並不想刪除它們——我不想更改數組的長度或更改匹配行的索引號。
目前,我正在解決這個問題,方法是用一個虛擬字元串作為佔位符替換不匹配的字元串,進行合併,然後刪除虛擬字元串,但這很笨拙。
未加引號的擴展會刪除空元素。您需要雙引號和
@
標誌或用於[@]
像在類似 Korn 的 shell 中一樣保留它們。您還需要使用 Korn 風格
${var/pattern/replacement}
而不是${array:#pattern}
因為後者是刪除元素而不是編輯其內容的風格。所以:set -o extendedglob array=( "${array[@]/#%^*$filter*}" ) print -rC1 -- "$array[@]"
下面是
#
在/
開頭錨定匹配,%
to錨定在結尾(和Korn shell一樣,只是不能在ksh中組合),^
是extendedglob
否定運算符。