通过bash交换两个字符串的位置

时间:2014-04-02 09:19:11

标签: linux bash shell debian

我想交换两个字符串的位置,例如1A to A12B to B2

bash有可能吗?

现在我以愚蠢的方式做这件事

case "$Zone" in
                    1A)
                        Zone="A1"
                        ;;
                    2A)
                        Zone="A2"
                        ;;
                    3A)
                        Zone="A3"
                        ;;
                    4A)
                        Zone="A4"
                        ;;
                    1B)
                        Zone="B1"
                        ;;
                    2B)
                        Zone="B2"
                        ;;
                    3B)
                        Zone="B3"
                        ;;
                    4B)
                        Zone="B4" 
                        ;;
                    E)
                        Zone="E" 
                        ;;
                esac

有没有更明智的方法?

4 个答案:

答案 0 :(得分:3)

如果您碰巧只有1或2个字符的字符串,则可以将其反转。哦,UNIX中有rev命令:

zone=$(echo "$zone" | rev)

甚至更短

zone=$(rev <<< "$zone")

参见示例:

$ zone="E"
$ rev <<< "$zone"
E

$ zone="A1"
$ rev <<< "$zone"
1A

来自man rev

 rev — reverse lines of a file or files

答案 1 :(得分:3)

您的要求不明确,输入的可能性有哪些?如果只有number + A or B模式有效且需要处理?

我认为你需要验证,而这个单线程就可以完成这项任务:

awk -v FS=''  '/^[1-5][A-L]$/{$0=$2""$1}7'

一些例子:

kent$  echo "1A
2A
3B
3X
E
foo"|awk -v FS=''  '/^[1-5][A-L]$/{$0=$2""$1}7'
A1
A2
B3
3X
E
foo

你只有在

时才会看到
  • 字符串的长度为2
  • 并从范围[1-5]
  • 中的一个数字开始
  • A-L
  • 结尾

它会被逆转,否则,它会保持不变。

答案 2 :(得分:2)

如果反向字符串有效,那就试一试

x=$(echo $zone | rev)

希望有所帮助:)

答案 3 :(得分:0)

使用子字符串扩展来获取字符串的第二个和第一个字符:

Zone=${Zone:1:1}${Zone:0:1}