在編寫腳本時,我想用換行符替換除 alpha ([a-zA-Z]) 之外的所有字元。根據定義,當使用 -c 標誌(設定補碼)時,tr 應該將 SET1 中沒有的所有字元替換為 SET2 中指定的字元。然而,它並沒有按預期工作......試試這個:
echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n'
我得到的輸出:
[[
lower
]]
可以看出,它替換了列,但沒有替換方括號,而它應該替換方括號。
誰能澄清這一點嗎?
答案1
tr
不解釋該正規表示式樣式的字元類別。
[a-zA-Z]
被解釋為一組[
,字元範圍從a
到z
和]
。
因此,它的補碼是包含所有字元 but 的字元集,以及從到和 的[
字元範圍。a
z
]
這就是為什麼[
和]
沒有被替換。
要替換任何非字母字符,只需指定a-zA-Z
為要替換的集合的補集:
echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
lower
%