免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3383 | 回复: 0
打印 上一主题 下一主题

Bash字符串处理(与Java对照) - 25.字符串分割(成数组) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-03 11:15 |只看该作者 |倒序浏览
Bash字符串处理(与Java对照) - 25.字符串分割(成数组)





In Java
String.split
String[]     split(String regex)
          根据给定的正则表达式的匹配来拆分此字符串。
String[]     split(String regex, int limit)
          根据匹配给定的正则表达式来拆分此字符串。



In Bash
简单介绍一下Bash中的数组的定义和使用方法
在Bash中,每个变量都可以作为一维数组使用,并且Bash也只支持一维数组。

$VAR等同于${VAR[0]}



还有一种多此一举的声明数组的方法:declare -a VAR



数组数据的设置方式有:
  1. VAR=(v1 v2 v3)

  2. VAR=([0]=v0 [1]=v1 [2]=v2)

  3. VAR[0]=v0
复制代码
引用数组元素的方式:

$VAR  ${VAR}  ${VAR[0]}  第0个元素

${VAR[n]}  第n个元素(n从0开始计算)



引用整个数组:

${VAR
  • }  ${VAR
  • }   这两种方式等同,会把数组展开。

    "${VAR
  • }"  表示把数组拼接在一起的整个字符串,如果作为参数传递,会把整个字符串作为一个参数。

    "${VAR[@]}"  如果作为参数传递,表示把数组中每个元素作为一个参数,数组有多少个元素,就会展开成多少个参数。



    计算数组元素长度:

    ${#VAR
  • }  ${#VAR[@]}   不是 ${#VAR},因为它等同于 ${#VAR[0]}




    注意:数组元素长度 != 最大索引 + 1,因为Bash的数组是稀疏数组(Sparse array)。
    1. [root@web ~]# a[1]=1
    2. [root@web ~]# a[1000]=1000
    3. [root@web ~]# declare -p a
    4. declare -a a='([1]="1" [1000]="1000")'
    5. [root@web ~]# echo "$a"

    6. [root@web ~]# echo "$a[1]"
    7. [1]
    8. [root@web ~]# echo "${a[@]}"
    9. 1 1000
    10. [root@web ~]# echo "${#a[@]}"
    11. 2
    12. [root@web ~]#
    复制代码
    遍历数组元素:(注意双引号)

    1. for ELEM in "${ARRAY[@]}"

    2. do

    3.     echo $ELEM

    4. done
    复制代码
    以空白作为分隔符来拆分字符串构造数组
    ARR=($STR)

    注意$STR不能加引号。
    1. [root@jfht ~]# STR="Hello World"
    2. [root@jfht ~]# ARR=($STR)
    3. [root@jfht ~]# declare -p ARR
    4. declare -a ARR='([0]="Hello" [1]="World")'
    5. [root@jfht ~]#
    复制代码
    用指定分隔符来拆分字符串构造数组
    如果分隔符不是空白,而是别的,那么需要借助IFS变量。
    1. default IFS (Internal Field Separator, which is space/tab/new line)



    2. [root@jfht ~]# echo $PATH
    3. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    4. [root@jfht ~]# IFS=: DIRS=($PATH)
    5. [root@jfht ~]# declare -p DIRS   
    6. declare -a DIRS='([0]="/usr/kerberos/sbin" [1]="/usr/kerberos/bin" [2]="/usr/apache/apache-ant-1.7.1/bin" [3]="/usr/local/sbin" [4]="/usr/local/bin" [5]="/sbin" [6]="/bin" [7]="/usr/sbin" [8]="/usr/bin" [9]="/root/bin")'
    7. [root@jfht ~]#
    复制代码
    但是下面的方式是不行的。
    1. [root@jfht ~]# echo $PATH
    2. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    3. [root@jfht ~]# IFS=: declare -a DIRS=($PATH)
    4. [root@jfht ~]# declare -p DIRS
    5. declare -a DIRS='([0]="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin")'
    6. [root@jfht ~]#
    复制代码
    使用read -a来拆分字符串构造数组
    All work and no play makes Jack a dull boy.
    只会用功不玩耍,聪明孩子也变傻。

    1. [root@jfht ~]# PROVERB="All work and no play makes Jack a dull boy."
    2. [root@jfht ~]# read -a WORDS <<<$PROVERB
    3. [root@jfht ~]# echo "$WORDS"
    4. All
    5. [root@jfht ~]# echo "${#WORDS}"
    6. 3

    7. [root@jfht ~]# echo "${WORDS[*]}"
    8. All work and no play makes Jack a dull boy.
    9. [root@jfht ~]# echo "${WORDS[@]}"
    10. All work and no play makes Jack a dull boy.
    11. [root@jfht ~]# echo "${#WORDS[*]}"
    12. 10
    13. [root@jfht ~]# echo "${#WORDS[@]}"
    14. 10
    复制代码
    前面的例子中要分割的字符串是以空格分割的,现在举一个以:分割的例子。

    1. [root@jfht ~]# echo $IFS

    2. [root@jfht ~]# IFS=: read -r -a DIRS <<<"$PATH"
    3. [root@jfht ~]# echo $IFS

    4. [root@jfht ~]# declare -p DIRS
    5. declare -a DIRS='([0]="/usr/kerberos/sbin" [1]="/usr/kerberos/bin" [2]="/usr/apache/apache-ant-1.7.1/bin" [3]="/usr/local/sbin" [4]="/usr/local/bin" [5]="/sbin" [6]="/bin" [7]="/usr/sbin" [8]="/usr/bin" [9]="/root/bin")'
    6. [root@jfht ~]#
    复制代码
    下面的例子是将当前工作目录以/进行分割。
    1. [root@jfht ctmw]# echo $PWD
    2. /root/work191/ct08/src/ctmw
    3. [root@jfht ctmw]# IFS=/ read -r -a PARTS <<<$PWD
    4. [root@jfht ctmw]# declare -p PARTS
    5. declare -a PARTS='([0]=" root work191 ct08 src ctmw")'
    6. [root@jfht ctmw]#
    7. [root@jfht ctmw]# IFS=/ read -r -a PARTS <<<"$PWD"
    8. [root@jfht ctmw]# declare -p PARTS                 
    9. declare -a PARTS='([0]="" [1]="root" [2]="work191" [3]="ct08" [4]="src" [5]="ctmw")'
    10. [root@jfht ctmw]#
    复制代码
    使用cut命令分隔字符串
    echo "$STR" | cut -f $N

    以TAB分隔,打印第N个子串值,N从1开始计数。

    echo "$STR" | cut -d "$DELIM" -d $N

    以指定DELIM分隔,打印第N个子串值,N从1开始计数。

    其中,-d部分也可以是$N1,$N2,$N3的形式,即输出多个子串。



    A good beginning is half done.
    良好的开端是成功的一半。
    1. [root@jfht ~]# STR="A good beginning is half done."
    2. [root@jfht ~]# echo $STR | cut -d ' ' -f 2         
    3. good



    4. [root@jfht ~]# echo $PATH
    5. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    6. [root@jfht ~]# echo $PATH | cut -d ':' -f 3
    7. /usr/apache/apache-ant-1.7.1/bin

    8. [root@jfht ~]# echo $PATH | cut -d ':' -f 3,5
    9. /usr/apache/apache-ant-1.7.1/bin:/usr/local/bin
    复制代码
    使用awk命令分隔字符串
    1. echo "$STR" | awk '{print $1}'

    2. echo "$STR" | awk '{print $2}'
    复制代码
    注意:awk后面的参数用单引号,不能用双引号。
    1. [root@jfht ~]# STR="A good beginning is half done."
    2. [root@jfht ~]# echo "$STR" | awk '{print $1}'
    3. A
    4. [root@jfht ~]# echo "$STR" | awk '{print $2}'
    5. good
    6. [root@jfht ~]# echo "$STR" | awk '{print $5,$6}'
    7. half done.
    复制代码
    本文链接:http://codingstandards.iteye.com/blog/1164910   (转载请注明出处)
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP