颠倒string中的字符顺序

在string“12345”中,输出string“54321”。 最好没有第三方工具和正则expression式。

我知道你说的是“没有第三方工具”,但是有时候一个工具太明显是正确的,再加上它默认安装在大多数Linux系统上:

[madhatta@risby tmp]$ echo 12345|rev 54321 

简单:

 var="12345" copy=${var} len=${#copy} for((i=$len-1;i>=0;i--)); do rev="$rev${copy:$i:1}"; done echo "var: $var, rev: $rev" 

输出:

 $ bash rev var: 12345, rev: 54321 

rev | tail -r rev | tail -r (BSD)或rev | tac rev | tac (GNU)也是反向行:

 $ rev <<< $'12\n34' | tail -r 43 21 $ rev <<< $'12\n34' | gtac 43 21 

如果LC_CTYPE是C,rev将反转多字节字符的字节:

 $ LC_CTYPE=C rev <<< あの   め  $ export LC_ALL=C; LC_ALL=en_US.UTF-8 rev <<< あののあ 

假定variables'var'的值是'123'

 var="123" 

反转string并存储一个新的variables'rav':

 rav=$(echo $var | rev) 

你会看到“rav”具有使用echo的“321”的值。

 echo $rav 

这反转了string“in place”:

 a=12345 len=${#a} for ((i=1;i<len;i++)); do a=$a${a: -i*2:1}; done; a=${a:len-1} echo $a 

或者第三行可以是:

 for ((i=0;i<len;i++)); do a=${a:i*2:1}$a; done; a=${a:0:len} 

要么

 for ((i=1;i<len;i++)); do a=${a:0:len-i-1}${a: -i:i+1}${a:len-i-1:1}; done 

这当然可以缩短,但应该很容易理解:最后的print添加换行符。

 echo 12345 | awk '{for (i = length($0); i > 0; i--) {printf("%s", substr($0, i, 1));} print "";}' 

一个bash解决scheme改进@osdyng答案(我的编辑不被接受):

 var="12345" rev="" for(( i=0 ; i<${#var} ; i++ )); do rev="${var:i:1}$rev"; done echo "var: $var, rev: $rev" 

或者更简单的(bash)循环:

 var=$1 len="${#var}" i=0 rev="" while (( i<len )); do rev="${var:i++:1}$rev"; done echo "var: $var, rev: $rev" 

一个POSIX解决scheme:

 var="12345" rev="" i=1 while [ "$i" -le "${#var}" ] do rev="$(echo "$var" | awk -vi="$i" '{print(substr($0,i,1))}')$rev" : $(( i+=1 )) done echo "var: $var, rev: $rev" 

注意:这适用于多字节string。 切割解决scheme只能用于ASCII(1字节)的string。

如果var=12345

bash for((i=0;i<${#var};i++)); do rev="$rev${var:~i:1}"; done for((i=0;i<${#var};i++)); do rev="$rev${var:~i:1}"; done

sh c=$var; while [ "$c" ]; do rev=$rev${c#"${c%?}"}; c=${c%?}; done c=$var; while [ "$c" ]; do rev=$rev${c#"${c%?}"}; c=${c%?}; done

 echo "var: $var, rev: $rev" 

运行:

 $ rev var: 12345, rev: 54321 

对于那些没有rev (推荐)的人来说,下面这个简单的awk解决scheme将空string上的字段(每个字符都是一个单独的字段)进行拆分并打印相反:

 awk -F '' '{ for(i=NF; i>0; i--) printf("%s", $i); print "" }' 

上面的awk代码是POSIX兼容的。 作为一个投诉awk实现保证在每个POSIX兼容的操作系统上,代码不应该被认为是“第三方”。 这个代码可能比纯粹的POSIX sh (或bash )解决scheme更简洁明了。

(;我不知道你是否认为空string-F正则expression式…;)

一些反转string的简单方法

 echo '!!!esreveR si sihT' | grep -o . | tac | tr -d '\n' ; echo echo '!!!esreveR si sihT' | fold -w 1 | tac | tr -d '\n' ; echo 

转换为hex值然后反转

 echo '!!!esreveR si sihT' | xxd -p | grep -o .. | tac | xxd -r -p ; echo echo '!!!esreveR si sihT' | xxd -p | fold -w 2 | tac | xxd -r -p ; echo