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.根据位置和长度截取子串

 

 

如何在 Bash 中将字符串计算为数字? 就像 Linux 中的一切都是文件一样,bash 中的一切都是字符串。 从技术上讲,Bash 中没有数据类型,本质上,Bash 变量只是字符串。 当您尝试在 bash 中进行算术运算时,这会产生问题,您尝试添加的数字会给您带来奇怪的结果。 ywmt@wljslmz:~$ sum=3+6 ywmt@wljslmz:~$ echo $sum 3+6 要在 bash 中将字符串转换为整数,请将它们包装在 $((X)) 中,像这样: $((string)) 如果字符串有一个可识别的数字,它将被视为一个数字,我上 阅读详情

相关推荐

【网络图】:附Origin详细画图教程

网络图,是一种由节点(或顶点)和连接这些节点的边(或链路)组成的图形结构。在网络图中,节点通常代表系统中的一个实体(如项目中的一项任务、通信网络中的一个设备、或运输网络中的一个站点),而边则代表这些实体之间的直接联系或流动(如任务的先后顺序、数据的传输路径、或乘客的旅行路线)。 有向图:如果边具有方向性,即从一个节点指向另一个节点,则称为有向图。这种图常用于表示具有明确先后顺序或方向性的系统,如项目管理中的任务依赖关系。 无向图:如果图中的边没有方向,则称为无向图。它适用于表示实体间相互关联但无明确方向性的

weixin_50236590的博客 3954

[work] Bash 将字符串拆分成数组

split string to array in bash 和AS中的String.split不同,Bash没有类似的语法,但它实在是太灵活了,有很多种方式可以做类似的事情。 以前我写过一篇 Bash数组操作教程 ,今天使用Bash做文件处理的时候,发现有必要再写一篇将字符串拆分成数组的教程。但发现有人已经写了更好的教程在前面了,于是就偷懒转过来好了。 下面的内容转自Bash @ Linux...

This is bill的专属博客 1430

大疆无人机地理视频制作全流程:从SRT文件到GIS叠加(附实战避坑指南)

本文详细解析了大疆无人机地理视频制作全流程,从解析SRT文件中的位姿数据,到在GIS软件中构建地理视频工程并生成可分发的文件。文章重点介绍了地理视频的核心概念、数据处理实战技巧,并探讨了其在应急响应、工程巡检等场景的高级应用与精度边界,为GIS工程师和无人机爱好者提供了一份实用的避坑指南。

river的博客 463

在Bash中将字符串拆分为数组

In a Bash script I would like to split a line into pieces and store them in an array. 在Bash脚本中,我想将一

asdfgh0077的博客 1482

振动信号相位测量的关键技术解析

本文深入解析了振动信号相位测量的关键技术,强调相位是振动信号的“身份证”,对于动平衡和故障诊断至关重要。文章详细阐述了键相传感器与振动传感器的选型、安装要点,以及时域和频域(FFT)核心算法,并针对现场噪声、转速波动等挑战提供了实战解决方案,帮助工程师实现精准、稳定的相位测量。

vv45678的博客 838

「深度学习之优化算法」(五)差分进化算法

每次迭代将先进行变异操作,选择一个或多个个体的基因作为基,然后选择不同的个体的差分来构成差分基因,最后将作为基的基因与差分基因相加来得出新的个体。,大喊一声,进化吧,魔王兵i的基因改变了。交叉率CR,影响基因取自变异基因的比例,由于至少要保留一位自己的基因和变异的基因导致CR在该问题上对算法性能的影响不大(这个问题比较简单,维度较低,影响不大)。与遗传算法同为进化算法的差分进化算法,它们的操作(算子)也都非常相似的,都是交叉,变异和选择,流程也几乎一样(遗传算法先交叉后变异,差分进化算法先变异后交叉)。

quanzhan_King的博客 1505

bash 字符串截取、替换及数组

语法格式 说明 ${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。 ${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。 ${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。 ${string: 0-start} 从 string

xiaoQL520的博客 1080

【VxWorks】Vxworks、QNX、Xenomai、Intime、Sylixos、Ucos等实时操作系统的性能特点

VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统,是嵌入式开发环境的关键组成部分。其内核支持多任务调度(采用基于优先级抢占方式,同时支持同优先级任务间的分时间片调度)、任务间的同步、进程间通信机制、中断处理、定时器和内存管理机制等,且提供了一个快速灵活的与 ANSIC 兼容的 I/O 系统,网络支持 对其它VxWorks系统和TCP/IP网络系统的"透明"访问。具有良好的持续发展能力、良好的可靠性、卓越的实时性和高性能的内核以及友好的用户开发环境。

smartvxworks的博客 1064

Bash处理字符串系列函数(二)

文章目录按分隔符拆分字符串将字符串改为小写将字符串改为大写 按分隔符拆分字符串 警告: 需要 bash 4+ 这是cut、awk和其他工具的替代品。 示例函数: split() { # Usage: split "string" "delimiter" IFS=$'\n' read -d "" -ra arr <<< "${1//$2/$'\n'}" printf '%s\n' "${arr[@]}" } 示例用法: $ split "apples,oranges,pe

qq_32019341的博客 526

模型预测控制 (MPC, Model Predictive Control) 算法详解及案例分析

模型预测控制是一种基于模型的控制策略,通过在线求解一个有限时域的优化问题,预测系统的未来行为,并根据预测结果调整控制输入,以实现系统的稳定性和性能优化。

闲人编程的博客 2934

Open3D 三维重建-Delaunay Triangulation (德劳内三角剖分)

德劳内三角剖分(Delaunay Triangulation)是一种用于从一组点生成三角形网格的算法。它的特点是使得生成的三角形尽量接近等边三角形,即最大化最小角度,避免生成细长的三角形。

纵马踏花向自由 2502

BASH字符串处理:字符串分割为数组

http://codingstandards.iteye.com/blog/1164910 Bash字符串处理(与Java对照) - 25.字符串分割(成数组) In Java String.split  String[]     split(String regex)           根据给定的正则表达式的匹配来拆分此字符串。  String[]

zouyongjin的专栏 7763

YOLOv11架构革新:华为VanillaNet与BiFPN深度融合的突破性改进实战指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

LXY_LOVE36的博客 136

shell 将行内容存为数组_shell 分割字符串存至数组

shell 分割字符串存至数组shell编程中,经常需要将由特定分割符分割的字符串分割成数组,多数情况下我们首先会想到使用awk但是实际上用shell自带的分割数组功能会更方便。假如a=”one,two,three,four”要将$a分割开,可以这样:OLD_IFS=”$IFS”IFS=”,”arr=($a)IFS=”$OLD_IFS”for s in ${arr[@]}doecho “$s”do...

weixin_39762464的博客 2965

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Bash Shell编程----Shell中的数组与字符串

Shell中的数组 数组的定义: 在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。 例,array=(java spring python shell linux sql "spring boot") 若是元素内也有空格,则必须使用引号 数组的赋值: 直接赋值:array=(java spring python shel...

wuud__的博客 1198

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

linux+shell+字符分割字符串函数,Linux Bash Shell字符串分割substring等(转)

原文https://blog.csdn.net/wuyinggui10000/article/details/52779364脚本开发中遇到的问题是:原java中的字符串分割操作(substring indexOf等)不知道怎么处理(比如/a/b/c/d.txt我想知道文件的名称)查询相关资料得知,shell中可以采用标识符来做分割字符串,包括substring(0,index)和substrin...

weixin_32645721的博客 745

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Linux】Shell 脚本中的字符串处理技巧

本文介绍了Shell脚本中的字符串处理技巧,包括字符串定义与赋值、长度计算、截取与切片等基础操作,并通过密码强度检查和文件路径处理等实战案例展示了这些技巧的应用。文中还提供了对应的Java代码示例,便于开发者对比理解不同语言中的字符串处理方式。文章内容实用,适合Shell脚本初学者和进阶开发者学习参考。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

shell字符串和数组

1、字符串 字符串可以用单引号,也可以用双引号,也可以不用引号 单双引号的区别: 双引号里可以有变量,单引号则原样输出; 双引号里可以出现转义字符,单引号则原样输出; 单引号字串中不能出现单引号。 1.1、拼接字符串 #!/bin/bash str1='i' str2='love' str3='you' echo $str1 $str2 $str3 echo $str1$str2$str3 echo $str1,$str2,$str3 输出: i love you iloveyou i,lov

a777122的博客 2266

「速通Shell」Shell 数组、关联数组与 mapfile

这一篇我们把 shell 里的容器都过了一遍。shell 数组虽然不如 Python 那么优雅,但一旦掌握,能解决日常脚本 80% 的数据组织问题

NoBack7--For the dream 1316

【Linux】Shell 脚本中的数组操作

Shell 数组是一种用于存储多个值的变量结构。它支持索引访问(从0开始),可以动态扩展,且元素类型不限(字符串、数字混合存储)。Bash Shell 支持一维数组,不直接支持多维数组(但可通过技巧模拟)。💡 注意:不同 Shell(如 zsh、ksh)对数组的支持略有差异,本文默认使用Bash Shell。场景描述推荐方案系统管理、自动化任务✅ Shell 数组配置文件解析小规模数据临时处理✅ Shell 数组大数据量或复杂算法⚠️ 换 Java/PythonWeb 应用、企业级后端。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

关于字符串分割问题

package liuying; public class Test {  public static void main(String[] args) { //字符串   String a = "100";   char[] b = a.toCharArray();   for (int i = 0; i    System.out.println(b[i] + " ");  

ly646857201的专栏 528

统计文本文件中单词频率的 Swift 与 Bash 实现详解

本文将探讨如何统计文本文件中每个单词的出现频率,具体实现包括 Bash 脚本的经典解法和 Swift 的高效实现。我们不仅会提供完整的代码,还将逐步拆解逻辑,帮助读者理解实现细节。同时,文章会分析时间与空间复杂度,并附上运行示例及结果。Bash 解法: 简洁高效,适用于快速处理任务。Swift 解法: 代码结构清晰,适合需要更多功能扩展的场景。

记录从移动端、鸿蒙到物联网与AI的完整实战与思考。专注于分享可复用的工程方案与产品思维,尤其深入鸿蒙生态与全栈开发。以十年工程与管理沉淀,为你提供清晰的技术纵深路径。坚信技术的价值在于“贯通”与“落地”。 1746

Bash for 循环示例

循环是任何类型的编程或脚本语言的一个非常重要的部分。与任何其他标准编程一样,循环在 bash 编程中用于执行重复任务。在三种类型的循环(while、do-while、for)中,for 循环对于执行各种类型的迭代任务非常有用。这里显示了“for”循环的基本用法。但“for”循环可用于执行一些高级任务。如果您想了解 for 循环的更多用法,那么您必须阅读本教程。本教程展示了 12 个最有用的“for”循环示例,以了解 bash 中“for”循环的其他具体用法。for 循环在 bash 中可以通过两种方式使用。

木牛的博客 800

Bash Infinity终极指南:新手到专家的完整学习路径

Bash Infinity是一个现代化的Bash标准库和框架,它将C#、Java或JavaScript等语言的概念引入Bash,让脚本编写更简洁、可读性更强。无论你是Bash新手还是有经验的开发者,本指南都能帮助你快速掌握这个强大工具的核心功能和使用方法。 ## 为什么选择Bash Infinity? 传统Bash脚本常常因为语法晦涩、错误处理复杂而让开发者头疼。Bash Infinity通过

gitblog_01024的博客 777

awk 截取部分字符串_干货-Shell编程文本处理三剑客之-awk

awk在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Pet...

weixin_39605840的博客 3002

Linux Bash杂记

在Bash中,当希望获取用户输入的内容时,可以用到【read】命令,有点类似 c++的cin 或 Java的System.in; read [-pt] variable -p: 在输入的时候给予用户提示; -t: 等待输入超时的时间 variable: 输入的内容赋值到的变量名 如: read -p "Input Your Name:" -t 30 name 变量 变量在系统中分为自定...

weixin_40932275的博客 216
上一篇: 在Linux下怎样让top命令启动之后就按内存使用排序(或CPU使用排序)?
下一篇: Bash字符串处理(与Java对照) - 26.根据位置和长度截取子串
codingstandards
博客等级 码龄16年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值