当我键入此命令时:
$ echo 1234567890 | tr '9-0' '9876'
上面写着“tr:“9-0”的范围端点是反向排序顺序”。这是什么意思?这是否意味着我只能输入“0-9”?
7gcisfzg1#
是的,就是这个意思。“9-0”不是一个范围,就像“z-a”是一个范围一样。否则,它怎么知道你的意思是0-9还是从9开始的整个unicode范围,到范围的顶部,再回到0?
rmbxnbpk2#
POSIX字符类是“按顺序”的,不能以这种方式反转。创建一个自己的新“类”,并按照需要的顺序排列。您可以在tr中使用自定义类作为变量。请记住,类本质上是位置的,而不是顺序的:
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
2条答案
按热度按时间7gcisfzg1#
是的,就是这个意思。“9-0”不是一个范围,就像“z-a”是一个范围一样。否则,它怎么知道你的意思是0-9还是从9开始的整个unicode范围,到范围的顶部,再回到0?
rmbxnbpk2#
POSIX字符类是“按顺序”的,不能以这种方式反转。
创建一个自己的新“类”,并按照需要的顺序排列。
您可以在
tr
中使用自定义类作为变量。请记住,类本质上是位置的,而不是顺序的:
换句话说,5-4-3-2-1不会自动“翻转”为1-2-3-4-5。
这应该给予你一个关于“反转”类的想法:
Reverse sequence for tr