![tr -c '[a-zA-Z]' '\n' 不替换所有补码字符](https://linux22.com/image/76452/tr%20-c%20'%5Ba-zA-Z%5D'%20'%5Cn'%20%E4%B8%8D%E6%9B%BF%E6%8D%A2%E6%89%80%E6%9C%89%E8%A1%A5%E7%A0%81%E5%AD%97%E7%AC%A6.png)
在编写脚本时,我想用换行符替换除 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
%