tr -c '[a-zA-Z]' '\n' 不取代所有補碼字符

tr -c '[a-zA-Z]' '\n' 不取代所有補碼字符

在編寫腳本時,我想用換行符替換除 alpha ([a-zA-Z]) 之外的所有字元。根據定義,當使用 -c 標誌(設定補碼)時,tr 應該將 SET1 中沒有的所有字元替換為 SET2 中指定的字元。然而,它並沒有按預期工作......試試這個:

echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n'

我得到的輸出:

[[
lower
]]

可以看出,它替換了列,但沒有替換方括號,而它應該替換方括號。

誰能澄清這一點嗎?

答案1

tr不解釋該正規表示式樣式的字元類別。

[a-zA-Z]被解釋為一組[,字元範圍從az]

因此,它的補碼是包含所有字元 but 的字元集,以及從到和 的[字元範圍。az]

這就是為什麼[]沒有被替換。

要替換任何非字母字符,只需指定a-zA-Z為要替換的集合的補集:

echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'



lower



%

相關內容