在字符串“12345”中,输出字符串“54321”。最好没有第三方工具和正则表达式。
答案 0 :(得分:139)
我知道你说“没有第三方工具”,但有时候一个工具显然是正确的工具,而且它默认安装在大多数Linux系统上:
[madhatta@risby tmp]$ echo 12345|rev
54321
答案 1 :(得分:19)
简单:
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
答案 2 :(得分:10)
rev | tail -r
(BSD)或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 <<< あの
のあ
答案 3 :(得分:10)
假设变量'var'的值为'123'
var="123"
反转字符串并存储在新变量'rav'中:
rav=$(echo $var | rev)
你会看到'rav'的值为'321',使用echo。
echo $rav
答案 4 :(得分:7)
改进了@osdyng答案的bash解决方案(我的编辑未被接受):
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解决方案:
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"
注意:这适用于多字节字符串。剪切解决方案仅适用于ASCII(1字节)字符串。
答案 5 :(得分: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
或第三行可能是:
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
答案 6 :(得分:4)
对于那些没有 rev (推荐)的人,有以下简单的 awk 解决方案,它会拆分空字符串上的字段(每个字符都是一个单独的字段)并打印出来反向:
awk -F '' '{ for(i=NF; i; i--) printf("%c", $i); print "" }'
以上 awk 代码符合POSIX标准。由于符合标准的 awk 实现保证在每个符合POSIX的操作系统上,因此解决方案不应被视为&#34;第三方。&#34;与纯POSIX sh (或 bash )解决方案相比,此代码可能更简洁易懂。
(;我不知道你是否认为空字符串是-F正则表达式...;)
答案 7 :(得分:3)
这当然可以缩短,但应该很容易理解:最后print
添加换行符。
echo 12345 | awk '{for (i = length($0); i > 0; i--) {printf("%s", substr($0, i, 1));} print "";}'
答案 8 :(得分:3)
一些简单的反转字符串的方法
echo '!!!esreveR si sihT' | grep -o . | tac | tr -d '\n' ; echo
echo '!!!esreveR si sihT' | fold -w 1 | tac | tr -d '\n' ; echo
转换为十六进制值然后反转
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
答案 9 :(得分:3)
似乎没有人发布sed
解决方案,所以这里有一个适用于非GNU sed的解决方案(因此我不认为它是“第三方”)。它确实使用正则表达式.
捕获单个字符,但这是唯一的正则表达式。
分两个阶段:
$ echo 123456 | sed $'s/./&\\\n/g' | sed -ne $'x;H;${x;s/\\n//g;p;}'
654321
这使用bash格式替换在脚本中包含换行符(因为问题标记为bash)。它首先将输入字符串分成每个字符一行,然后将每个字符插入保持缓冲区的开头。
x
交换保留空间和模式空间,H
H将(当前)模式空间附加到保留空间。因此,对于每个角色,我们将该角色放入保持空间,然后将旧的保持空间附加到它,从而反转输入。最后一个命令删除换行符以重建原始字符串。
这适用于任何单个字符串,但它会将多行输入连接成一个输出字符串。
答案 10 :(得分:2)
如果var=12345
:
bash 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
echo "var: $var, rev: $rev"
运行它:
$ rev
var: 12345, rev: 54321
答案 11 :(得分:0)
这是另一个更简单的awk
解决方案:
awk 'BEGIN{FS=""} {for (i=NF; i>0; i--) s=s $i; print s}' <<< '123456'
654321
答案 12 :(得分:-1)
读单词
reve=`echo "$word" | awk '{for(i=length($0); i>0;i--) printf (substr($0,i,1));}'`
echo "$reve"