如何通过sed命令判断回文字符串?
如:abba,level
方法一:
$ echo "abba" | sed -n '/\(.\)\(.\)\2\1/p'
可以判断长度为4的字符是否为回文。
$ echo "level" | sed -n '/\(.\)\(.\)\(.\)\2\1/p'
可以判断长度为5的字符是否为回文。
我稍微解释下,”\(.\)”代表了任意一个字符,”\(“是对”(“进行了转义,sed需要”\2″表示是对刚才匹配到的字符的反向引用,就好比是一个变量。\1就是反向引用第一个匹配到的,\2就是反向引用第2个匹配到的。
如果需要判断的字符数为偶数,比如为4个,则”\(.\)”就有2个,反向引用就是\2和\1;如果需要判断的字符数为奇数个,比如为5个,则”\(.\)”就有3个,反向引用就是\2和\1,中间的那个就不需要反向引用了,也就是\3没有必要判断。我们可以看到这个”\(.\)”的个数是和字符数的长度有关。
参考:http://www.groad.net/bbs/simple/?t6847.html
补充源码:
#!/bin/bash if [ $# -ne 2 ]; then echo "Usage: $0 filename string_length" exit -1 fi filename=$1; basepattern='/^(.)' count=$(( $2 / 2 )) for ((i=1; i<$count; i++)) do basepattern=$basepattern'(.)'; done if [ $(( $2 % 2 )) -ne 0 ]; then basepattern=$basepattern'.'; fi for ((count; count>0; count--)) do basepattern=$basepattern''"$count"; done basepattern=$basepattern'$/p' sed -n "$basepattern" $filename
========
还有更简单的方法,即使用rev命令进行判断,rev命令是将字符串反向,源代码如下:
#!/bin/bash while read word do if [[ "$word" == "$(echo $word | rev)" ]]; then echo "$word is Palindrome" fi done < /usr/share/dict/british-english
sed并不能判断任意长度的“回文”。