【问题标题】:tr '[z-a]' '[a-z]' yields error messagetr '[z-a]' '[a-z]' 产生错误信息
【发布时间】:2012-01-15 11:59:06
【问题描述】:

我想用tr 命令模拟rev 命令(按字母表)

所以我这样做了

echo abcdefghijklmnopqrstuvxyz | tr '[z-a]' '[a-z]'

这给了我

tr: `z-a' 的范围端点以反向排序顺序排列

所以我尝试了

echo abcdefghijklmnopqrstuvxyz | tr 'abcdefghijklmnopqrstuvxyz' 'zyxvutsrqponmlkjihgfedcba'

一切正常,输出为zyxvutsrqponmlkjihgfedcba

tr '[z-a]' '[a-z]' 有问题吗?

如果我指定tr '[a-c]' '[c-a]',它也可以正常工作。

任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: bash tr


    【解决方案1】:

    我认为你对“[c-a]”这件事很幸运,我的 tr 说 tr: [c-a]: invalid destination string,这是我所期望的。

    字符范围,即 [a-z],在我处理过的所有语言中,都需要升值。 很高兴您已经找到了解决方案。

    或者写一个你可以使用的函数,比如tr "[a-z]" "[$( revCharRange a-z )]" (由于创建反向字符范围所需的子外壳,这将更加昂贵。

    编辑 其中revCharRange a-z 将输出zyxw...cba

    我希望这会有所帮助。

    【讨论】:

    • 我怀疑 [c-a] 被解释为 5 个字符 [, c, ... 因为 [] 不是 tr 中的字符范围所必需的(它们是对于 SysV,但不是在 POSIX 中,现代 tr 试图同时允许两者,但有一些警告)
    • @BenJackson :是的,好点,不幸的是,我的经验可以追溯到 POSIX 之前,因此影响了我发布的许多答案 ;-) 感谢您的提醒。祝大家好运。
    • tr '[a-z A-Z]' '[n-za-m N-ZA-M]' 这样的东西也可以提供帮助。您可以将 az 到 za 的顺序颠倒过来,方法是将其放在要翻译的字符范围之间。在这种情况下,我将向前移动 13 个字母(例如 Rot13)。
    • @Gcap:这对反转订单有什么帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多