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



%

相关内容