颠倒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