关于linux shell的tr命令错误

toe95027  于 2023-05-16  发布在  Linux
关注(0)|答案(2)|浏览(151)

当我键入此命令时:

$ echo 1234567890 | tr '9-0' '9876'

上面写着“tr:“9-0”的范围端点是反向排序顺序”。这是什么意思?这是否意味着我只能输入“0-9”?

7gcisfzg

7gcisfzg1#

是的,就是这个意思。“9-0”不是一个范围,就像“z-a”是一个范围一样。否则,它怎么知道你的意思是0-9还是从9开始的整个unicode范围,到范围的顶部,再回到0?

rmbxnbpk

rmbxnbpk2#

POSIX字符类是“按顺序”的,不能以这种方式反转。
创建一个自己的新“类”,并按照需要的顺序排列。
您可以在tr中使用自定义类作为变量。
请记住,类本质上是位置的,而不是顺序的:

$ nums="0123456789" && rev="9876543210" ; echo $nums ; echo $rev
0123456789
9876543210

$ rev="9876543210" && echo 54321 | tr "$nums" "$rev"
45678

换句话说,5-4-3-2-1不会自动“翻转”为1-2-3-4-5。
这应该给予你一个关于“反转”类的想法:

#!/bin/sh

LC_ALL=C
i=0
true > members
while [ "$i" -le 127 ]
do
    echo "$i" | awk '{ printf "%c", $0 }' | awk '/[[:digit:]]/ { print }'
    # echo "$i" | awk '{ printf "%c", $0 }' | grep '[[:digit:]]' 
    i=$(( i + 1 ))
done >> members

str=`printf "%s\n" "$(tr -d '\n' < members)"`
rev=""

# finding the length of string
len="${#str}"

# traverse the string in reverse order
while [ $len -ne 0 ]
do
    rev="${rev}"`echo "${str}" | cut -c $len`
    len=$(( len -1 ))
done

echo "$str"
echo "$rev"

Reverse sequence for tr

相关问题