在编写脚本时,我想用换行符替换除 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
%