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