字符串的截取及切割

案例1:字符串截取及切割

1.1 问题
使用Shell完成各种Linux运维任务时,一旦涉及到判断、条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串。
本案例要求熟悉字符串的常见处理操作,完成以下任务练习:
• 参考PPT示范操作,完成子串截取、替换等操作
• 根据课上的批量改名脚本,编写改进版renfilex.sh:能够批量修改当前目录下所有文件的扩展名,修改前/后的扩展名通过位置参数$1、$2提供
1.2 方案
子串截取的三种用法:
变 量 名 : 起 始 位 置 : 长 度 • e x p r s u b s t r " {变量名:起始位置:长度} • expr substr " ::exprsubstr"变量名" 起始位置 长度
• echo 变 量 名 ∣ c u t − b 起 始 位 置 − 结 束 位 置 子 串 替 换 的 两 种 用 法 : • 只 替 换 第 一 个 匹 配 结 果 : 变量名 | cut -b 起始位置-结束位置 子串替换的两种用法: • 只替换第一个匹配结果: cutb{变量名/old/new}
• 替换全部匹配结果: 变 量 名 / / o l d / n e w 字 符 串 掐 头 去 尾 : • 从 左 向 右 , 最 短 匹 配 删 除 : {变量名//old/new} 字符串掐头去尾: • 从左向右,最短匹配删除: //old/new{变量名#关键词}
• 从左向右,最长匹配删除:KaTeX parse error: Expected '}', got '#' at position 5: {变量名#̲#*关键词} • 从右向左,…{变量名%关键词
}
• 从右向左,最长匹配删除:${变量名%%关键词*}
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:字符串的截取
1)方法一,使用 表 达 式 格 式 : {}表达式 格式: {变量名:起始位置:长度}
使用${}方式截取字符串时,起始位置是从0开始的。
定义一个变量phone,并确认其字符串长度:

  1. [root@svr5 ~]# phone=“13788768897”
  2. [root@svr5 ~]# echo ${#phone}
  3. 11 //包括11个字符
    使用${}截取时,起始位置可以省略,省略时从第一个字符开始截。比如,以下操作都可以从左侧开始截取前6个字符:
  4. [root@svr5 ~]# echo ${phone:0:6}
  5. 137887
    或者
  6. [root@svr5 ~]# echo ${phone::6}
  7. 137887
    因此,如果从起始位置1开始截取6个字符,那就变成这个样子了:
  8. [root@svr5 ~]# echo ${phone:1:6}
  9. 378876
    2)方法二,使用 expr substr
    格式:expr substr “$变量名” 起始位置 长度
    还以前面的phone变量为例,确认原始值:
  10. [root@svr5 ~]# echo $phone
  11. 13788768897
    使用expr substr截取字符串时,起始编号从1开始,这个要注意与${}相区分。
    从左侧截取phone变量的前6个字符:
  12. [root@svr5 ~]# expr substr “$phone” 1 6
  13. 137887
    从左侧截取phone变量,从第9个字符开始,截取3个字符:
  14. [root@svr5 ~]# expr substr “$phone” 9 3
  15. 897
    3)方式三,使用cut分割工具
    格式:echo $变量名 | cut -b 起始位置-结束位置
    选项 -b 表示按字节截取字符,其中起始位置、结束位置都可以省略。当省略起始位置时,视为从第1个字符开始(编号也是从1开始,与expr类似),当省略结束位置时,视为截取到最后。
    还以前面的Phone变量为例,确认原始值:
  16. [root@svr5 ~]# echo $phone
  17. 13788768897
    从左侧截取前6个字符,可执行以下操作:
  18. [root@svr5 ~]# echo $phone | cut -b 1-6
  19. 137887
    从第8个字符截取到末尾:
  20. [root@svr5 ~]# echo $phone | cut -b 8-
  21. 8897
    只截取单个字符,比如第9个字符:
  22. [root@svr5 ~]# echo $phone | cut -b 9
  23. 8
    截取不连续的字符,比如第3、5、8个字符:
  24. [root@svr5 ~]# echo $phone | cut -b 3,5,8
  25. 788
    4)一个随机密码的案例
    版本1:
  26. [root@svr5 ~]# vim rand.sh
  27. #!/bin/bash
  28. x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
  29. //所有密码的可能性是26+26+10=62(0-61是62个数字)
  30. num=$[RANDOM%62]
  31. pass=${x:num:1}
    版本2:
  32. [root@svr5 ~]# vim rand.sh
  33. #!/bin/bash
  34. x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
  35. //所有密码的可能性是26+26+10=62(0-61是62个数字)
  36. pass=’’
  37. for i in {1…8}
  38. do
  39. num=$[RANDOM%62]
  40. tmp=${x:num:1}
  41. pass= p a s s {pass} passtmp
  42. done
  43. echo p a s s 步 骤 二 : 字 符 串 的 替 换 1 ) 只 替 换 第 1 个 子 串 格 式 : pass 步骤二:字符串的替换 1)只替换第1个子串 格式: pass11{变量名/old/new}
    还以前面的phone变量为例,确认原始值:
  44. [root@svr5 ~]# echo $phone
  45. 13788768897
    将字符串中的第1个8替换为X:
  46. [root@svr5 ~]# echo ${phone/8/X}
  47. 137X8768897
    2)替换全部子串
    格式:${变量名//old/new}
    将phone字符串中的所有8都替换为X:
  48. [root@svr5 ~]# echo ${phone//8/X}
  49. 137XX76XX97
    步骤三:字符串的匹配删除
    以处理系统默认的账户信息为例,定义变量A:
  50. [root@svr5 ~]# A=head -1 /etc/passwd
  51. [root@svr5 ~]# echo $A
  52. root❌0:0:root:/root:/bin/bash
    1)从左向右,最短匹配删除
    格式:${变量名#关键词}
    删除从左侧第1个字符到最近的关键词“:”的部分,
    作通配符理解:
  53. [root@svr5 ~]# echo ${A#*:}
  54. x:0:0:root:/root:/bin/bash
    2)从左向右,最长匹配删除
    格式:${变量名##*关键词}
    删除从左侧第1个字符到最远的关键词“:”的部分:
  55. [root@svr5 ~]# echo $A //确认变量A的值
  56. root❌0:0:root:/root:/bin/bash
  57. [root@svr5 ~]# echo ${A##*:}
  58. /bin/bash
    3)从右向左,最短匹配删除
    格式:${变量名%关键词*}
    删除从右侧最后1个字符到往左最近的关键词“:”的部分,* 做通配符理解:
  59. [root@svr5 ~]# echo ${A%😗}
  60. root❌0:0:root:/root
    4)从右向左,最长匹配删除
    格式:${变量名%%关键词*}
    删除从右侧最后1个字符到往左最远的关键词“:”的部分:
  61. [root@svr5 ~]# echo ${A%%😗}
  62. root
    步骤四:编写renfilex.sh脚本
    创建一个测试用的测试文件
  63. [root@svr5 ~]# mkdir rendir
  64. [root@svr5 ~]# cd rendir
  65. [root@svr5 rendir]# touch {a,b,c,d,e,f,g,h,i}.doc
  66. [root@svr5 rendir]# ls
  67. a.doc b.doc c.doc d.doc e.doc f.doc g.doc h.doc i.doc
    1)批量修改文件扩展名的脚本
    脚本用途为:批量修改当前目录下的文件扩展名,将.doc改为.txt。
    脚本内容参考如下:
  68. [root@svr5 rendir]# vim renfile.sh
  69. #!/bin/bash
  70. for i in ls *.doc #注意这里有反引号
  71. do
  72.  mv $i  ${i%.*}.txt
    
  73. done
  74. [root@svr5 ~]# chmod +x renfile.sh
    测试脚本:
  75. [root@svr5 rendir]# ./renfile.sh
  76. [root@svr5 rendir]# ls
  77. a.txt b.txt c.txt d.txt e.txt f.txt g.txt h.txt i.txt
    2)改进版脚本(批量修改扩展名)
    通过位置变量 $1、$2提供更灵活的脚本,改进的脚本编写参考如下:
  78. [root@svr5 rendir]# vim ./renfile.sh
  79. #!/bin/bash
  80. #version:2
  81. for i in ls *.$1
  82. do
  83.  mv $i  ${i%.*}.$2
    
  84. done
    3)验证、测试改进后的脚本
    将 *.doc文件的扩展名改为.txt:
  85. [root@svr5 rendir]# ./renfile.sh txt doc
    将 *.doc文件的扩展名改为.mp4:
  86. [root@svr5 rendir]# ./renfile.sh doc mp4
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值