当前位置: 首页 > news >正文

shell分割字符串函数(支持特殊字符和不可见字符)

awk,sed是shell里最常用的分隔字符串的命令
但是对于不可见字符(\n,\r,\t),对于特殊字符(?,*,#,$)做分割符,操作比较困难
而且获取结果不方便,
 
 
因此我写了个分割函数支持
1.各种不可见字符(\n,\r,\t),对于特殊字符(?,*,#,$),任意长度的分隔符
2.返回结果为数组
 
 
 
  1. #!/bin/bash   
  2.  
  3. #分割字符串函数   
  4.  
  5. #参数1 split_argv1:要分割的字符串   
  6.  
  7. #参数2 split_argv2:分隔符   
  8.  
  9. #返回值:0:成功,1:失败;   
  10.  
  11. #结果集:split_array数组   
  12.  
  13. #   
  14.  
  15. split_str(){   
  16.  
  17. if [ "$split_argv2" == "" ]   
  18.  
  19. then   
  20.  
  21. return 1;   
  22.  
  23. fi   
  24.  
  25. split_len=0;   
  26.  
  27. split_array=();   
  28.  
  29. break_len=${#split_argv2}   
  30.  
  31. #判断是否包含分隔符,获取索引   
  32.  
  33. index=`expr index "$split_argv1" "$split_argv2"`   
  34.  
  35. while [[ "$index" -gt "0" ]]   
  36.  
  37. do   
  38.  
  39. #获得分割好的字符串   
  40.  
  41. split_array[$split_len]=${split_argv1:0:$index-1}   
  42.  
  43. split_len=$split_len+1;   
  44.  
  45. #记录截断的字符串   
  46.  
  47. split_argv1=${split_argv1:$index-1+break_len}   
  48.  
  49. index=`expr index "$split_argv1" "$split_argv2"`   
  50.  
  51. done   
  52.  
  53. #把最后一个保存   
  54.  
  55. split_array[$split_len]=$split_argv1;   
  56.  
  57. return 0;   
  58.  
  59. }   
  60.  
  61.  
  62.  
  63. echo "------------------------------------------------------------------"   
  64.  
  65. split_argv1=$1;   
  66.  
  67. split_argv2=$2;   
  68.  
  69. echo "argv1=[$1]"   
  70.  
  71. echo "argv2=[$2]"   
  72.  
  73. #测试   
  74.  
  75. split_str $1 $2   
  76.  
  77.  
  78.  
  79. #打印结果   
  80.  
  81. alen=${#split_array[*]};   
  82.  
  83. echo -n "result="   
  84.  
  85. for ((i=0;i< $alen;i++))   
  86.  
  87. do   
  88.  
  89. echo -n "["${split_array[$i]}"],";   
  90.  
  91. done   
  92.  
  93. echo "";   
  94.  
  95. echo "------------------------------------------------------------------"   
  96.  
  97. exit 0; 

运行结果

 

 
 
  1. ------------------------------------------------------------------   
  2.  
  3. [root@localhost cgi-bin]# sh split_str.sh "1*2*3*4" "*"   
  4.  
  5. ------------------------------------------------------------------   
  6.  
  7. argv1=[1*2*3*4]   
  8.  
  9. argv2=[*]   
  10.  
  11. result=[1],[2],[3],[4],   
  12.  
  13. ------------------------------------------------------------------   
  14.  
  15. [root@localhost cgi-bin]# sh split_str.sh "a   
  16.  
  17. b   
  18.  
  19. c   
  20.  
  21. d" "   
  22.  
  23. "   
  24.  
  25. ------------------------------------------------------------------   
  26.  
  27. argv1=[a   
  28.  
  29. b   
  30.  
  31. c   
  32.  
  33. d]   
  34.  
  35. argv2=[   
  36.  
  37. ]   
  38.  
  39. result=[a],[b],[c],[d],   
  40.  
  41. ------------------------------------------------------------------   
  42.  
  43. [root@localhost cgi-bin]# sh split_str.sh "1abc23 abcd4" "abc"   
  44.  
  45. ------------------------------------------------------------------   
  46.  
  47. argv1=[1abc23 abcd4]   
  48.  
  49. argv2=[abc]   
  50.  
  51. result=[1],[23 ],[d4],   
  52.  
  53. ------------------------------------------------------------------  

 

     本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/609354,如需转载请自行联系原作者


相关文章:

  • JSP中动态include与静态include的区别介绍
  • 云计算网络基础第六天
  • Asp.Net中虚拟文件系统的使用
  • yum管理详解
  • mysql数据库操纵语言
  • Centos7系列(三)防火墙与网络区域详解
  • table的使用以及其内padding、margin的实现
  • 判断点是否在多边形内部
  • 算法系列——算法入门之递归分而治之思想的实现
  • 建立名称server
  • Hyper-V Server增强会话模式
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Spring AOP 1
  • 如何启动Nunit的调试功能
  • ELK日志分析系统实战(一)安装和部署
  • 345-反转字符串中的元音字母
  • 5、React组件事件详解
  • eclipse(luna)创建web工程
  • Electron入门介绍
  • es6
  • JavaScript 奇技淫巧
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • javascript面向对象之创建对象
  • Java编程基础24——递归练习
  • Linux各目录及每个目录的详细介绍
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Objective-C 中关联引用的概念
  • overflow: hidden IE7无效
  • 开源地图数据可视化库——mapnik
  • 前端攻城师
  • 实习面试笔记
  • 微信公众号开发小记——5.python微信红包
  • 小程序01:wepy框架整合iview webapp UI
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 由插件封装引出的一丢丢思考
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #### go map 底层结构 ####
  • $L^p$ 调和函数恒为零
  • (pojstep1.3.1)1017(构造法模拟)
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (四)c52学习之旅-流水LED灯
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net framework profiles /.net framework 配置
  • .NET 解决重复提交问题
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net语言中的StringBuilder:入门到精通
  • // an array of int
  • /etc/sudoer文件配置简析