Linux - Shell - 字符串截取
概述
- 简述 字符串 截取
背景
- 之前因为要给文件 批量重命名, 做过字符串截取
- 当时做好了, 也说了要写点东西
- 结果忘了
- 现在又要尝试批量 重命名
- 才发现之前的东西已经忘了好多
- 要是当时把博客写下来, 该多好
准备
- os
- win10
- git
- 2.20.1
- os
约定
- 例子里有的例子会失败
- 当然这个是 预料到的
- 没有结论总结
- 太懒
- 从头看到尾, 也不需要太多时间
- 对了
- 所有的操作, 都不会改变源字符串内容
- 例子里有的例子会失败
1. 需求
概述
- 简单描述 需求
- 简单分类, 后面细说
- 简单描述 需求
截取字符串
- 按下标截取
- 按模式匹配
2. 按下标截取
概述
- 按下标截取
目的
- 尝试使用 下标, 来对 字符串进行操作
例子1: 尝试直接用 [] 方式获取
概述
- 尝试用 数组下标 的方式, 获取字符串内容
脚本
#!/bin/bash str="123456"
echo ${str}
echo ${str[0]}
结果
$ ./script01.sh
123456
123456
结论
- 无法通过 [] 来 正确获取 字符串 字串
- 这不是废话
- 无法通过 [] 来 正确获取 字符串 字串
例子2: 开始下标
概述
- 正式开始尝试
脚本
#!/bin/bash str="123456"
echo ${str:0}
echo ${str:1}
结果
$ ./script02.sh
123456
23456
结论
- 字符串的下标, 从 0 开始
- ${str:offset}
- 从 offset 开始
- 一直截取到字符串结束
疑问
字符串如果有问题, 会是什么情况呢
- 变量为空
- 返回空串, 也没有异常
- 变量为 空串
- 返回空串, 也没有异常
- 变量为空
下标异常
- 负数下标
- 常规负数
- -1, -2
- 结果
- 好像并不能 识别出来
- 感觉是 语法的问题
- 但是 书上 却没有写出来, 我感觉算是书上的错误
- 另一种表达
- 0-1, 0-2
- 结果
- 从 右边开始算下标
- 0-1 表示最后一位
- 0-2 表示倒数第二位
- ${str:0-2}
- 截取字符串最后两位
- 从 右边开始算下标
- 常规负数
- 下标大于长度
- 返回空串, 也没有异常
- 负数下标
建议
- 变量
- 避免使用 空变量, 空串
- 下标
- 避免使用 异常下标
- 变量
我不想截取到结束, 怎么有办法吗?
- 当然有啦
例子3: 开始下标 和 指定长度
概述
- 尝试指定 开始下标 和 指定长度
脚本
#!/bin/bash echo group1
str="012345"
echo ${str:0:1}
echo ${str:1:1}
echo ${str:1:2}
echo ${str:0:6}
echo ''
结果
group1
0
1
12
012345
结论
- ${str:offset:length}
- offset
- 开始下标
- length
- 字串长度
- 结果
- 从开始下标开始, 截取长度为 length 的字串
- offset
- ${str:offset:length}
疑问
- 我有办法知道字串多长呢?
- 定长的好说
- 变长的怎么办呢?
- 当然有啦
- 我有办法知道字串多长呢?
例子4: 字符串长度
概述
- 求 字符串长度 的方法
脚本
#!/bin/bash
echo group2
echo ${#str}
echo ${str:0:${#str}}
echo ''
结果
group2
6
012345
结论
- ${#str}
- 可以求出 str 的长度
- 可以嵌套在 ${str:offset:length} 中
- ${#str}
其他: 问题
概述
- 其他的问题
问题
offset
- 负数
- 常规负数
- -1, -2
- 没有效果, 感觉是 语法不支持
- 0-1, 0-2
- 常规负数
- 大于长度
- 返回空串
- 负数
length
- 负数
- 结果不太正常, 不建议
- 大于长度
- 直接到字符串结尾
- 负数
空变量/空串
- 没有异常, 没有返回
疑问
- 我想要根据特定字符, 来做 截取, 有办法吗?
- 当然有啦
- 我想要根据特定字符, 来做 截取, 有办法吗?
3. 模式匹配与截取
概述
- 截取的另一种思路
目的
- 从根据 特定关键字截取
- 给定特定模式
- 删除符合模式的内容, 返回余下内容
- 从根据 特定关键字截取
问题
- 匹配方向
- 左边开始
- 右边开始
- 匹配策略
- 不贪婪
- 贪婪
- 匹配内容
- 模式, 通配符
- 匹配方向
例子1: 从头匹配
概述
- 从头开始匹配
脚本
#!/bin/bash str="abcdabcdabcd" echo group1
echo ${str}
echo ${str#*bc}
echo ${str##*bc}
结果
group1
abcdabcdabcd
dabcdabcd
d
结论
${str#pattern}
- 格式
- str 是需要截取的源字符串
- pattern 是 模式串
- 格式
关注点
- 匹配方向
#是 从左往右
- 匹配策略
#不贪婪- 最短模式串
##贪婪- 最长模式串
- 模式
- 类似通配符
- ? 表示单个字符
*表示多个字符- [] 可以有 字符集合
- 不是正则
- 不是正则
- 不是正则
- 类似通配符
- 匹配方向
疑问
- 是否可以从后往前匹配呢?
- 当然可以啦
- 是否可以从后往前匹配呢?
例子2: 从尾匹配
概述
- 从尾开始匹配
脚本
#!/bin/bash str="abcdabcdabcd" echo group1
echo ${str}
echo ${str%bcd*}
echo ${str%%bcd*}
结果
group1
abcdabcdabcd
abcdabcda
a
结论
${str%pattern}
- 格式
- str 是需要截取的源字符串
- pattern 是 模式串
- 格式
关注点
- 匹配方向
- % 是 从右往左
- 匹配策略
- % 不贪婪
- 最短模式串
- %% 贪婪
- 最长模式串
- % 不贪婪
- 模式
- 同 从左往右
- 匹配方向
其他
- 其他注意事项
如果没匹配到
- 那就没有结果
理解
- 可以借用 括号
假设我有 这么个串 "1 + ( 2 + ( 3 + 3 ) + 2 ) + 1"
- 删除左边, 通常用 *(
- 删除右边, 通常用 )*
边界
- 边界也会被删除
- 如果需要边界, 记得自己补上
- 可以借用 括号
ps
ref
- 学习 bash
疑问: 是否有从 shell 中获取特定字符的下标
需求
- 给定字符串 str
- 给定特定字符 s
- 获取获取 s 在 str 中的位置
寻找结果
- 貌似没有找到
其他
- 可以确定 str 里是否包含 s
- 可以根据 s 做截取
- 可以根据 s 做替换
- 这个后面讲
疑问
- 获取 s 在 str 里的下标, 目的到底是什么
- 截取
- 替换
- 根据下标位置, 精准划分, 从而确定行为?
- 获取 s 在 str 里的下标, 目的到底是什么
其他
- 这么点破事, 感觉写的 有点长 啊
Linux - Shell - 字符串截取的更多相关文章
- Linux shell字符串截取与拼接
一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1 # 号截取,删除左边字符,保留右边字符. echo ${va ...
- Linux 的shell 字符串截取很有用。有八种方法。
一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1 # 号截取,删除左边字符,保留右边字符. echo ${va ...
- linux shell 字符串操作(长度,查找,替换)详解
linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...
- Linux 的字符串截取方法(转)
Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. echo ${var#*//} ...
- linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )
在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...
- shell 字符串截取
${expression}一共有9种使用方法. ${parameter:-word},如果parameter为空,则用word的值做parameter的缺省值 ${parameter:=word},在 ...
- 【转】shell字符串截取
shell字符串的截取的问题: 一.Linux shell 截取字符变量的前8位,有方法如下: 1.expr substr “$a” 1 8 2.echo $a|awk ‘{print substr( ...
- linux shell 字符串操作
转:http://justcoding.iteye.com/blog/1963463 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作 ...
- Shell字符串截取
shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...
随机推荐
- PHP0013:PHP操作文件案例 遍历phpdamin目录
- JAVA JDK keytool 生成数字证书
简介: 数字证书作为网络安全数据传输的凭证,web在传输时客户端(浏览器)和 服务端(服务器)先进行会话握手,在握手过程中服务端会验证客户端的是否已经在服务端做了认证,这是单向认证.如果是双向认证的话 ...
- netty 的事件驱动
netty 是事件驱动的,这里面有两个含义,一是 netty 接收到 socket 数据后,会产生事件,事件在 pipeline 上传播,二是事件由特定的线程池处理. NioEventLoop 轮询网 ...
- linux下定时网站文件备份和数据备份以及删除旧备份标准代码
直切正题: 文件备份:web.sh 数据备份:db.sh 删除旧备份:clear.sh vi web.sh文件内容为: #!/bin/bash 解释:shell脚本标准头 cd 网站文 ...
- Linux CURL的安装和使用
--获得安装包,从网上直接下载或者其他途径,这里直接wget# wget http://curl.haxx.se/download/curl-7.17.1.tar.gz--解压到当前目录# tar - ...
- ZedGraph5.1.5源码分析去掉鼠标悬浮内容闪烁问题(附源码下载)
场景 在使用ZedGraph绘制曲线图时,将鼠标悬浮时内容闪烁,且频率很高. 找到其源码,发现不论鼠标移动的范围大小,甚至乎不论鼠标是否移动,都要刷新一次Tooltip. 注: 博客主页:https: ...
- 组件使用v-model、$listeners、.sync(区别于v-model的双向数据绑定)
自定义组件 自定义组件的v-model 首先我们先说一下在自定义组件中使用v-model的必要条件 在自定义的组件中要有input(这里我们先不讨论单选复选框) 在自定义组件的模板对象中要有props ...
- 内网hash传递
前言: 我们在平常打点的时候,遇到有内网或者有域的环境的时候,我们只获得了内网中的一台机子的shell,由这台机子我们可以获得这台机子所在的网段的相关其他主机.比如说有域的时候的域控机,有多层内网的堡 ...
- P1041 传染病控制【暴搜】
P1041 传染病控制 提交 10.78k 通过 3.74k 时间限制 1.00s 内存限制 125.00MB 题目提供者CCF_NOI 难度提高+/省选- 历史分数100 提交记录 查看题解 标签 ...
- BDA3 Chapter 1 Probability and inference
1. uncertainty aleatoric uncertainty 偶然不确定性 epistemic uncertainty 认知不确定性 2. probability VS likelihoo ...