Zsh

使用 zsh,擦除不匹配的行但不刪除它們

  • November 14, 2022

如果我想刪除數組中不匹配的行,這很好用:

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否定運算符。

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