`

Bash字符串处理(与Java对照) - 25.字符串分割(成数组)

阅读更多

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

 

数组数据的设置方式有:

VAR=(v1 v2 v3)

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

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)。

[root@web ~]# a[1]=1
[root@web ~]# a[1000]=1000
[root@web ~]# declare -p a
declare -a a='([1]="1" [1000]="1000")'
[root@web ~]# echo "$a"

[root@web ~]# echo "$a[1]"
[1]
[root@web ~]# echo "${a[@]}"
1 1000
[root@web ~]# echo "${#a[@]}"
2
[root@web ~]#

 

遍历数组元素:(注意双引号)

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

do

    echo $ELEM

done

 

以空白作为分隔符来拆分字符串构造数组

ARR=($STR)

注意$STR不能加引号。

 

[root@jfht ~]# STR="Hello World"
[root@jfht ~]# ARR=($STR)
[root@jfht ~]# declare -p ARR
declare -a ARR='([0]="Hello" [1]="World")'
[root@jfht ~]#

 

用指定分隔符来拆分字符串构造数组

如果分隔符不是空白,而是别的,那么需要借助IFS变量。

default IFS (Internal Field Separator, which is space/tab/new line)

 

[root@jfht ~]# echo $PATH
/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
[root@jfht ~]# IFS=: DIRS=($PATH)
[root@jfht ~]# declare -p DIRS  
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")'
[root@jfht ~]#

 

但是下面的方式是不行的。

[root@jfht ~]# echo $PATH
/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
[root@jfht ~]# IFS=: declare -a DIRS=($PATH)
[root@jfht ~]# declare -p DIRS
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")'
[root@jfht ~]#

 

使用read -a来拆分字符串构造数组

All work and no play makes Jack a dull boy.
只会用功不玩耍,聪明孩子也变傻。

 

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

[root@jfht ~]# echo "${WORDS[*]}"
All work and no play makes Jack a dull boy.
[root@jfht ~]# echo "${WORDS[@]}"
All work and no play makes Jack a dull boy.
[root@jfht ~]# echo "${#WORDS[*]}"
10
[root@jfht ~]# echo "${#WORDS[@]}"
10

 

前面的例子中要分割的字符串是以空格分割的,现在举一个以:分割的例子。

[root@jfht ~]# echo $IFS

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

[root@jfht ~]# declare -p DIRS
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")'
[root@jfht ~]# 

 

下面的例子是将当前工作目录以/进行分割。

[root@jfht ctmw]# echo $PWD
/root/work191/ct08/src/ctmw
[root@jfht ctmw]# IFS=/ read -r -a PARTS <<<$PWD
[root@jfht ctmw]# declare -p PARTS
declare -a PARTS='([0]=" root work191 ct08 src ctmw")'
[root@jfht ctmw]#
[root@jfht ctmw]# IFS=/ read -r -a PARTS <<<"$PWD"
[root@jfht ctmw]# declare -p PARTS                
declare -a PARTS='([0]="" [1]="root" [2]="work191" [3]="ct08" [4]="src" [5]="ctmw")'
[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.
良好的开端是成功的一半。

 

[root@jfht ~]# STR="A good beginning is half done."
[root@jfht ~]# echo $STR | cut -d ' ' -f 2         
good

 

[root@jfht ~]# echo $PATH
/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
[root@jfht ~]# echo $PATH | cut -d ':' -f 3
/usr/apache/apache-ant-1.7.1/bin

[root@jfht ~]# echo $PATH | cut -d ':' -f 3,5
/usr/apache/apache-ant-1.7.1/bin:/usr/local/bin

 

使用awk命令分隔字符串

echo "$STR" | awk '{print $1}'

echo "$STR" | awk '{print $2}'

注意:awk后面的参数用单引号,不能用双引号。

 

[root@jfht ~]# STR="A good beginning is half done."
[root@jfht ~]# echo "$STR" | awk '{print $1}'
A
[root@jfht ~]# echo "$STR" | awk '{print $2}'
good
[root@jfht ~]# echo "$STR" | awk '{print $5,$6}'
half done.

 

 

 

 

本文链接:http://codingstandards.iteye.com/blog/1164910   (转载请注明出处)

返回目录:Java程序员的Bash实用指南系列之字符串处理(目录) 

上节内容:Bash字符串处理(与Java对照) - 24.文件路径字符串的处理

下节内容:Bash字符串处理(与Java对照) - 26.根据位置和长度截取子串

 

 

5
4
分享到:
评论
1 楼 zrong 2012-04-13  
感谢你的文章!
我已经转载到我的博客了,并标明了本文链接,谢谢!
http://zengrong.net/post/1591.htm

相关推荐

    mysql-connector-java-5.1.40.tar.gz

    MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了JDBC(Java Database Connectivity)标准的MySQL驱动程序。"mysql-connector-java-5.1.40.tar.gz" 是这个驱动程序的一个特定版本,版本号为...

    bash-3.1-MSYS-1.0.11-snapshot.tar

    bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 ffmpeg 安装用包!

    openjdk-17.0.2(openjdk-17.0.2_macos-aarch64_bin.tar.gz)

    3. **文本块(Text Blocks)**:Java 13 引入的新语法特性,使得多行字符串的编写更加直观,减少了转义字符的困扰。 4. **记录类(Record Classes)**:Java 14 添加的记录类简化了创建不可变数据对象的过程,自动...

    libaio-devel-0.3.106(i386 x86_64)

    ```bash rpm -ivh libaio-devel-0.3.106-3.2.i386.rpm ``` 而对于 x86_64 系统,则是: ```bash rpm -ivh libaio-devel-0.3.106-3.2.x86_64.rpm ``` 安装完成后,libaio-devel 提供的头文件(如 `libaio.h`)和开发...

    apache-tomcat-8.5.55.tar.gz

    Apache Tomcat是一款开源的Java Servlet容器,用于部署和运行Java Web应用程序。在Linux系统中安装`apache-tomcat-8.5.55.tar.gz`文件的过程涉及多个步骤,包括下载、解压、配置和启动服务。以下是详细的安装和配置...

    centos安装jdk1.8时出现没有/lib/ld-linux.so.2:这个文件的原因分析

    -bash: /usr/local/jdk/jdk1.8.0_181/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 安装完后 java -version 查看版本出现: 原因是:没有那个文件或目录,找了很久发现需要...

    fontconfig-2.13.0-4.3.el7.x86_64.zip

    在Linux系统中,字体管理是实现正确显示各种字符集,包括中文字符,的关键部分。`fontconfig`是一个开源的字体配置库,它负责管理和查找系统中的字体,为应用程序提供统一的接口来处理字体问题。在没有互联网连接...

    mysql-connector-java-8.0.13.jar

    MySQL Connector/J 8.0.13 是MySQL数据库与Java应用程序之间的重要桥梁,它是Oracle官方提供的用于Java平台的MySQL驱动程序。这个jar包允许开发者在Java应用中执行SQL语句,进行数据的读取、写入和管理MySQL数据库。...

    bash-4.1.2-15.el6_5.1.x86_64.rpm

    修复redhat6 bash远程执行任意代码漏洞CVE-2014-6271

    Java-JDK-11.0.8(Windows &amp;amp; Mac os) 下载

    5. **文本块(Text Blocks)**:预览特性,允许在代码中方便地插入多行字符串,减少转义字符的使用。 在下载和安装Java JDK 11.0.8之后,开发者可以使用`javac`编译Java源代码,生成字节码(`.class`文件)。通过`...

    bash-3.2-33.el5.1.x86_64.rpm

    修复bash远程执行漏洞,支持redhat linux 64位操作系统 CVE-2014-6271

    jdk-11.0.16.1-linux-x64-bin.tar

    标题中的"jdk-11.0.16.1-linux-x64-bin.tar"是一个针对Linux操作系统的64位Java Development Kit(JDK)的压缩文件,版本为11.0.16.1。这个文件是Oracle JDK的特定版本,用于在Linux环境下开发和运行Java应用程序。 ...

    perl-5.26.1.tar.gz

    - 支持Unicode 9.0,增强了字符串和正则表达式的处理能力。 - `List::Util`模块新增了一些实用函数,如`minmax`,方便处理列表数据。 - 错误消息和诊断信息的改进,提高了调试的便利性。 Perl语法特点: - 采用C...

    redis-3.2.8.tar.gz和tcl8.6.1-src.tar.gz

    对于Redis的进一步学习,了解其数据类型(如字符串、哈希、列表、集合和有序集合)以及命令是非常重要的。例如,`SET`用于设置键值,`GET`用于获取键的值,`LPUSH/RPOP`用于操作列表,`HSET/HGET`处理哈希等。此外,...

    bash补丁包.zip

    bash-3.0-27.0.3.el4.i386.rpm bash-debuginfo-3.0-27.el4.4.i386.rpm 2、rhel 4.x 64位 bash-3.0-27.el4.x86_64.rpm bash-debuginfo-3.0-27.el4.4.x86_64.rpm 3、centos5.x_32 bash-3.2-33.el5.1.i386.rpm bash-3.2...

    tftp-server-0.42-3.1.i386.rpm.

    《TFTP服务器在RHEL5系统中的应用与配置详解》 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种轻量级的文件传输协议,常用于设备初始化、固件更新、网络诊断等场景。在RHEL5(Red Hat Enterprise...

    protoc.exe和protobuf-java-2.5.0.jar集合

    综上所述,`protoc.exe`和`protobuf-java-2.5.0.jar`是protobuf工具链的关键组成部分,它们一起帮助开发者在Java环境中定义、编译和处理protobuf数据结构。为了充分利用protobuf,开发者需要了解如何编写.proto文件...

    rlwrap-0.37.tar.gz

    总的来说,rlwrap提供了一种更高效、更易用的方式来与sqlplus交互,尤其是在处理字符编码问题时。对于需要频繁使用sqlplus的数据库管理员和开发者来说,rlwrap是一个非常实用的工具。通过正确配置和使用rlwrap,可以...

    arm-linux-gcc-4.4.3.tar.gz

    为了让系统知道新的交叉编译器的位置,需要在用户或系统的`~/.bashrc`或`/etc/bash.bashrc`文件中添加以下内容: ```bash export CC=/usr/local/arm-linux-gcc-4.4.3/bin/arm-linux-gcc export CXX=/usr/local/arm-...

    fonts-chinese-3.02-12.el5.noarch.rpm和fonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm

    同时,对于需要处理中欧语言的环境,ISO 8859-2字体的提供则至关重要,因为它包含了那些区域的特殊字符,使得文本可以正确地被识别和打印。 总的来说,这两个rpm包提供了必要的字体资源,增强了CentOS系统对中文和...

Global site tag (gtag.js) - Google Analytics