linux下Bash中将字符串拆分成数组例子

split string to array in bash

和AS中的String.split不同,Bash没有类似的语法,但它实在是太灵活了,有很多种方式可以做类似的事情。

今天使用Bash做文件处理的时候,发现有必要再写一篇将字符串拆分成数组的教程。但发现有人已经写了更好的教程在前面了,于是就偷懒转过来好了。

下面的内容转自Bash @ Linux

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

ARR=($STR)

注意$STR不能加引号。

STR="Hello World"
ARR=($STR)
declare -p ARR
declare -a ARR='([0]="Hello" [1]="World")'

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

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

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

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
IFS=: DIRS=($PATH)
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")'

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

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
IFS=: declare -a DIRS=($PATH)
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")'

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

All work and no play makes Jack a dull boy.

只会用功不玩耍,聪明孩子也变傻。

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

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

echo $IFS
IFS=: read -r -a DIRS <<< "$PATH"
echo $IFS
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")'

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

echo $PWD
/root/work191/ct08/src/ctmw
IFS=/ read -r -a PARTS <<< $PWD
declare -p PARTS
declare -a PARTS='([0]=" root work191 ct08 src ctmw")'
IFS=/ read -r -a PARTS <<<"$PWD"
declare -p PARTS                
declare -a PARTS='([0]="" [1]="root" [2]="work191" [3]="ct08" [4]="src" [5]="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.

良好的开端是成功的一半。

STR="A good beginning is half done."
echo $STR | cut -d ' ' -f 2         
good
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
echo $PATH | cut -d ':' -f 3
/usr/apache/apache-ant-1.7.1/bin
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后面的参数用单引号,不能用双引号。

STR="A good beginning is half done."
echo "$STR" | awk '{print $1}'
A
echo "$STR" | awk '{print $2}'
good
echo "$STR" | awk '{print $5,$6}'
half done.

时间: 2024-07-31 07:05:01

linux下Bash中将字符串拆分成数组例子的相关文章

php使用explode()函数将字符串拆分成数组的方法

 这篇文章主要介绍了php使用explode()函数将字符串拆分成数组的方法,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php使用explode()函数将字符串拆分成数组的方法.分享给大家供大家参考.具体分析如下: explode()函数:字符串拆分成数组 示例代码如下: ? 1 2 3 4 5 6 <?php $str = "朝阳区,海淀区,西城区,东城区,丰台区"; $arr = explode(",",$str); echo &q

php使用explode()函数将字符串拆分成数组的方法_php技巧

本文实例讲述了php使用explode()函数将字符串拆分成数组的方法.分享给大家供大家参考.具体分析如下: explode()函数:字符串拆分成数组 示例代码如下: <?php $str = "朝阳区,海淀区,西城区,东城区,丰台区"; $arr = explode(",",$str); echo "<pre>"; print_r($arr); ?> 结果如下: <pre>Array ( [0] =>

Swift将字符串拆分成数组的例子

在Swift中,如果需要把一个字符串根据特定的分隔符拆分(split)成字符串数组,通常有如下两种方法: 1,使用componentsSeparatedByString()方法 let str = "北京.上海.深圳.香港" print("原始字符串:\(str)")   let splitedArray = str.componentsSeparatedByString(".") print("拆分后的数组:\(splitedArra

将一个数组按照固定大小进行拆分成数组的方法_java

如下所示: /** * ArraySplit.java * Copyright(C) 2014 */ package com.udpdemo.test2; import java.util.ArrayList; import java.util.List; /** * * @author cuiran * @version 1.0.0 */ public class ArraySplit { /** * @param args * */ public static void main(Strin

将linux下的rm命令改造成移动文件至回收站【转】

转自:http://blog.csdn.net/a3470194/article/details/16863803 [-] 将linux下的rm命令改造成移动文件至回收站 将AIX下的rm命令改造成移动文件至回收站 将linux下的rm命令改造成移动文件至回收站 rm是Linux下文件删除的命令,它是Linux下非常强大却又非常危险的一条命令,特别是rm -rf有时候强大到让你欲哭无泪,当你想清除当前目录下的所有文件和目录时,很简单 #rm -rf ./* 这没什么,但是,但是如果不小心打成这样

位图解析-linux下/dev/fb0怎样解析成windows下可以显示的图片

问题描述 linux下/dev/fb0怎样解析成windows下可以显示的图片 cat /dev/fb0 > /tmp/jietu 这样截取到的原始位图,复制到windows下之后改名为.png或者.bmp都不能打开: 据说要根据设备分辨率和颜色位深解析之后才可以,求具体解析算法,最好有代码~~ 解决方案 文件/dev/fb0就是控制屏幕上的每一点的颜色的文件. 然后通过 FrameBuffer 机制,把屏幕上的每个点映射成一段线性内存空间,最终可以获取到显示缓冲,即屏幕上显示的内容的图片. 解

这个程序在windows平台下能正常输出,结果也是对的。到linux下运行在50行产生数组溢出是怎么回事呢

问题描述 importjava.io.*;importjava.util.*;publicclassRout{publicstaticvoidmain(String[]args){//StringfilePath="d:\java\javatest\rout.txt";intreadLine[];readLine=newint[14];StringreadResult[]=newString[14];BufferedReaderreader=null;try{FileReaderfil

php中字符串转换成数组函数explode(),implode()

行看看这两个函数 implode 函数: 使用函数 implode 将数组转换为字符串 explode 函数: 使用函数 explode 将字符串转换成数组 例1. 今天在php论坛中看到以为朋友发了一个帖子请教php如何把字符串转换成数组;作为php程序员的新一第一反应是联想到explode(),implode()这两个函数.新一也是用里面的函数进行转换成数组的. con[1]=28&selt[1]=1&con[2]=29&selt[2]=4&con[3]=26&

将带下划线的字符串转换成驼峰格式

/** * 将带下划线的字段转换成驼峰 * @param source * @returns {string} */ function camelCase(source) { if (source) { return source.replace(/_([a-zA-Z])/g, function (g) { return g[1].toUpperCase(); }); } return ''; }