反转字符串中字符的顺序

68 bash

在字符串"12345"中,输出字符串"54321".最好没有第三方工具和正则表达式.

Mad*_*ter 151

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

[madhatta@risby tmp]$ echo 12345|rev
54321
Run Code Online (Sandbox Code Playgroud)

  • **就是这个!** (5认同)
  • 或者在 bash、zsh 和 ksh 中使用 `rev <<< 12345`。(不是破折号也不是 csh。) (4认同)
  • 但不适用于嵌入式发行版,例如 OpenWRT :-/ (2认同)
  • 我听到你的声音,但试试 `echo '\xff' |rev`。我从来没有说过 `echo -e` 会起作用,所以当它不起作用时把我耙在煤上似乎有点苛刻。 (2认同)

小智 21

简单:

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"
Run Code Online (Sandbox Code Playgroud)

输出:

$ bash rev
var: 12345, rev: 54321
Run Code Online (Sandbox Code Playgroud)


Lri*_*Lri 11

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

$ rev <<< $'12\n34' | tail -r
43
21
$ rev <<< $'12\n34' | gtac
43
21
Run Code Online (Sandbox Code Playgroud)

如果LC_CTYPE为C,则rev会反转多字节字符的字节:

$ LC_CTYPE=C rev <<< ??
????
$ export LC_ALL=C; LC_ALL=en_US.UTF-8 rev <<< ??
??
Run Code Online (Sandbox Code Playgroud)


小智 11

假设变量'var'的值为'123'

var="123"
Run Code Online (Sandbox Code Playgroud)

反转字符串并存储在新变量'rav'中:

rav=$(echo $var | rev)
Run Code Online (Sandbox Code Playgroud)

你会看到'rav'使用echo的值为'321'.

echo $rav
Run Code Online (Sandbox Code Playgroud)


小智 8

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

var="12345"     rev=""

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

echo "var: $var, rev: $rev"
Run Code Online (Sandbox Code Playgroud)

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

var=$1   len="${#var}"   i=0   rev=""

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

echo "var: $var, rev: $rev"
Run Code Online (Sandbox Code Playgroud)

POSIX解决方案:

var="12345"     rev=""    i=1

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

echo "var: $var, rev: $rev"
Run Code Online (Sandbox Code Playgroud)

注意:这适用于多字节字符串.剪切解决方案仅适用于ASCII(1字节)字符串.


Mic*_*ack 6

对于那些没有rev(推荐)的人,有以下简单的awk解决方案,可以拆分空字符串上的字段(每个字符都是一个单独的字段)并反向打印:

awk -F '' '{ for(i=NF; i; i--) printf("%c", $i); print "" }'
Run Code Online (Sandbox Code Playgroud)

上面的awk代码符合 POSIX 标准。由于在每个符合 POSIX 的操作系统上都保证了兼容的awk实现,因此不应将该解决方案视为“第 3 方”。与纯 POSIX sh(或bash)解决方案相比,此代码可能更简洁易懂。

(; 我不知道你是否认为 -F 是一个正则表达式的空字符串......;)


小智 6

反转字符串的一些简单方法

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

echo '!!!esreveR si sihT' | fold -w 1 | tac | tr -d '\n' ; echo
Run Code Online (Sandbox Code Playgroud)

转换为十六进制值然后反转

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
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 5

这会将字符串"就地"反转:

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

或者第三行可以是:

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

要么

for ((i=1;i<len;i++)); do a=${a:0:len-i-1}${a: -i:i+1}${a:len-i-1:1}; done
Run Code Online (Sandbox Code Playgroud)


小智 5

如果var=12345

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

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

echo "var: $var, rev: $rev"
Run Code Online (Sandbox Code Playgroud)

运行:

$ rev
var: 12345, rev: 54321
Run Code Online (Sandbox Code Playgroud)