Shell_Linux Shell 中实现字符串切割的几种方法_shell split string-程序员宅基地

技术标签: Shell_Shell编程  

我们在shell 脚本编程中,经常需要用到字符串切割,即将字符串切割为一个数组,类似java 中的split 函数,下面对几种常见的方式做一个总结。


参考文章:

shell 使用指定的分割符来分割字符串

https://blog.csdn.net/lw305080/article/details/78594011


目录

方法一: 利用shell 中 变量 的字符串替换   

方法二: 设置分隔符,通过 IFS 变量

方法三: 利用tr 指令实现字符替换  (!只能针对单个分隔符)




方法一: 利用shell 中 变量 的字符串替换

原理:

${parameter//pattern/string} 

用string来替换parameter变量中所有匹配的pattern

参考文章: https://blog.csdn.net/u010003835/article/details/80749220

示例:

#!/bin/bash

string="hello,shell,split,test"  
array=(${string//,/ })  

for var in ${array[@]}
do
   echo $var
done 




方法二: 设置分隔符,通过 IFS 变量

原理

自定义IFS变量, 改变分隔符, 对字符串进行切分

参考文章:

https://blog.csdn.net/whuslei/article/details/7187639  

一、IFS 介绍

     Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符。完整定义是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.

     Shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。

     而 IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

二、IFS 简单实例

1、查看变量 IFS 的值。

$ echo $IFS  
  
$ echo "$IFS" | od -b  
0000000 040 011 012 012  
0000004  
直接输出IFS是看不到的,把它转化为二进制就可以看到了,"040"是空格,"011"是Tab,"012"是换行符"\n" 。最后一个 012 是因为 echo 默认是会换行的。


示例

#!/bin/bash

string="hello,shell,split,test"  

#对IFS变量 进行替换处理
OLD_IFS="$IFS"
IFS=","
array=($string)
IFS="$OLD_IFS"

for var in ${array[@]}
do
   echo $var
done


运行结果







方法三: 利用tr 指令实现字符替换

原理

由于只是对单个字符进行的替换,则可以用  echo args |   tr "oldSpilt" "newSpilt"  的方式实现。


tr 指令讲解


背景介绍

tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。

语法
tr(选项)(参数)
选项
  -c或——complerment:取代所有不属于第一字符集的字符;
  -d或——delete:删除所有属于第一字符集的字符;
  -s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
  -t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
参数
  字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
  字符集2:指定要转换成的目标字符集。


示例:

#!/bin/bash

string="hello,shell,split,test"  
array=(`echo $string | tr ',' ' '` )  

for var in ${array[@]}
do
   echo $var
done 


shell 使用指定的分割符来分割字符串
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010003835/article/details/80750003

智能推荐

mysql 3.23 注入_安全狗SQL注入、上传绕过-2017-3-23-程序员宅基地

文章浏览阅读64次。作者是谁不清楚,看到群里分享出来的,所以转载到博客了。-----收集整理 by: www.nvhack.com 安全狗SQL注入绕过 测试文件,明显的字符型SQL 注入 _mysql注入上传绕开分号

pytorch环境搭建_import pytorch as pytouch-程序员宅基地

文章浏览阅读311次。我也是个新手所以遇到的问题可能不全面,不过确实有很多的坑,写下来,后面再补充第一步:找到b站安装视频https://www.bilibili.com/video/BV1oz411v7cv?from=search&seid=12498239426358158910第二步:按照上述步骤下载anaconda 这里指出官网下载需要注册,而恰巧你没有梯子,那么,你可以去清华的镜像网站 https://mirrors.tuna.tsinghua.edu.cn/anacon..._import pytorch as pytouch

autodesk genuine service卸载不掉,找不到autodesk genuine service.msi 怎么办_autodeskgenuineservice为什么卸载不掉-程序员宅基地

文章浏览阅读1w次。尝试了很多网上的方法,反复提到找到 autodesk genuine service.msi 这个文件,但是电脑里没有这个文件只有autodesk genuine service.conf这个文件把他删了再去控制面板卸载就可以了_autodeskgenuineservice为什么卸载不掉

华为荣耀鸿蒙3.0安装谷歌Play商店,安装谷歌服务三件套GMS,Google_华为鸿蒙安装googleplay三件套-程序员宅基地

文章浏览阅读6.6w次,点赞12次,收藏102次。我们升级到鸿蒙3.0也面临着一个问题,那就是安装谷歌服务框架GMS谷歌play商店。在鸿蒙2.0的时候我们使用工具:华谷套件,列,X2,XS2。那么我们升级到鸿蒙3.0也面临着一个问题,那就是安装谷歌服务框架GMS谷歌play商店。在鸿蒙2.0的时候我们使用工具:华谷套件,同时配置电脑链接手机降级备份就可以安装Play商店。最新的好消息鸿蒙3.0也可以安装谷歌Play商店了,而且不需要使用电脑,只需要一个安卓APP:华谷套件,就可以轻松地安装。同时我找了几款其他的机型,比如mate 40系列都是可以安装的。_华为鸿蒙安装googleplay三件套

【Qt】ubuntu下Qt开发环境的搭建_ubuntu qt环境搭建-程序员宅基地

文章浏览阅读3.4k次,点赞4次,收藏25次。在打开示例工程的过程中,由于示例工程的源码是安装到根目录(/opt/)下的,所以不具有写权限,这时候QtCreator会弹窗提示,我们可以选择将其复制到家目录下自定义的目录中即可。如果是新安装的ubuntu操作系统,需将软件包源更换为国内对应ubuntu版本下的源,方便软件包的安装。注意如果不是以sudo进行安装,则不能在根目录(/)下创建目录,Qt默认安装路径目录也不是在。上图红框中是必须选择的,其他的组件就根据自己的实际需要选择啦,此处我选择了。方式进行安装,或者根据具体的依赖提示进行处理。......_ubuntu qt环境搭建

为什么要malloc()?何时要malloc()?如何使用malloc()?_为什么要使用malloc-程序员宅基地

文章浏览阅读604次。函数原型:void *malloc(unsigned int num_bytes);  //分配长度为num_bytes字节的内存块返回值是void指针,void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型),可以通过类型强制转化转化为其他任意类型指针。如果分配成功..._为什么要使用malloc

随便推点

面向对象设计大作业——火车售票系统_铁路售票系统用例图购票用例规约-程序员宅基地

文章浏览阅读744次。用户注册登录:按始发地、目的地查询购票:按车次号查询购票:查看已购车票,退票,注销:管理员登录,查看所有用户信息:录入车次:删除车次:修改车次信息:查看所有车次:管理员注销:点击运行火车售票系统软件,用户输入用户名和密码,或者直接注册一个账号。登录成功后进入用户界面,可以选择按始发地、目的地或者车次号查询购票,点击用户信息里面的已购车票,可以查看已经购买的车票和进行退票,操作完成后进行注销。管理员输入唯一的账号进行登录,可以点击功能,查看所有用户信息或者注销返回登录界面。管理员可以录入车次,修改车次信息,删_铁路售票系统用例图购票用例规约

Dymola多学科系统仿真平台-程序员宅基地

文章浏览阅读279次。Dymola是法国Dassault Systems(达索)公司的多学科系统快速设计和验证工具,广泛应用于国内外汽车、交通、能源等行业的系统总体架构设计、选型及匹配验证、系统优化、控制系统MIL/HIL验证等。_dymola

mac error 2015-10-08-程序员宅基地

文章浏览阅读310次。Anonymous UUID: 9E5F7DE8-3A83-2978-8AC0-2FD1C1DC1171Thu Oct 8 23:36:14 2015*** Panic Report ***panic(cpu 0 caller 0xffffff8000816df2): Kernel trap at 0xffffff8000928ba2, type 14=pag..._fault cr2 fault cpu

Android SQL数据库操作(使用xUtils3)_android sqlutil-程序员宅基地

文章浏览阅读1.8k次。Android SQL数据库操作(使用xUtils3)目录Android SQL数据库操作使用xUtils3目录基础配置基础类基本操作增保存一条数据保存一组数据删删除一条数据删除所有删除一组数据条件删除改修改一条数据批量修改数据查查询所有数据查询某条模糊查询条件查询分组查询查询数量其他排序指定数量指定位置基础配置xUtils3地址: https:_android sqlutil

ubuntu利用crontab反弹shell_ubuntu新增crontab反弹shell-程序员宅基地

文章浏览阅读927次,点赞11次,收藏10次。在Ubuntu中,反弹shell是指在远程服务器上建立一个与本地计算机的交互式连接,以便可以在远程服务器上执行命令和操作。这种连接通常是通过网络进行的,允许用户在不直接登录到远程服务器的情况下,进行远程管理和操作。反弹shell通常使用一些常见的工具和技术来实现,包括SSH、Netcat、Metasploit等。用户可以在本地计算机上直接操作远程服务器,执行命令、浏览文件等操作。需要注意的是,反弹shell可能存在安全风险,因此在实际使用中应当谨慎操作,并确保对服务器进行充分的安全防护。_ubuntu新增crontab反弹shell

【附源码】Java计算机毕业设计中小学在线考试系统(程序+LW+部署)-程序员宅基地

文章浏览阅读95次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:java+ mybatis + Maven等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA。_小学在线考试系统