1. 概述

    1. 简述 字符串 截取
  2. 背景

    1. 之前因为要给文件 批量重命名, 做过字符串截取
    2. 当时做好了, 也说了要写点东西
      1. 结果忘了
    3. 现在又要尝试批量 重命名
      1. 才发现之前的东西已经忘了好多
      2. 要是当时把博客写下来, 该多好
  3. 准备

    1. os

      1. win10
    2. git
      1. 2.20.1
  4. 约定

    1. 例子里有的例子会失败

      1. 当然这个是 预料到的
    2. 没有结论总结
      1. 太懒
      2. 从头看到尾, 也不需要太多时间
    3. 对了
      1. 所有的操作, 都不会改变源字符串内容

1. 需求

  1. 概述

    1. 简单描述 需求

      1. 简单分类, 后面细说
  2. 截取字符串

    1. 按下标截取
    2. 按模式匹配

2. 按下标截取

  1. 概述

    1. 按下标截取
  2. 目的

    1. 尝试使用 下标, 来对 字符串进行操作

例子1: 尝试直接用 [] 方式获取

  1. 概述

    1. 尝试用 数组下标 的方式, 获取字符串内容
  2. 脚本

    #!/bin/bash
    
    str="123456"
    echo ${str}
    echo ${str[0]}
  3. 结果

    $ ./script01.sh
    123456
    123456
  4. 结论

    1. 无法通过 [] 来 正确获取 字符串 字串

      1. 这不是废话

例子2: 开始下标

  1. 概述

    1. 正式开始尝试
  2. 脚本

    #!/bin/bash
    
    str="123456"
    echo ${str:0}
    echo ${str:1}
  3. 结果

    $ ./script02.sh
    123456
    23456
  4. 结论

    1. 字符串的下标, 从 0 开始
    2. ${str:offset}
      1. 从 offset 开始
      2. 一直截取到字符串结束
  5. 疑问

    1. 字符串如果有问题, 会是什么情况呢

      1. 变量为空

        1. 返回空串, 也没有异常
      2. 变量为 空串
        1. 返回空串, 也没有异常
    2. 下标异常

      1. 负数下标

        1. 常规负数

          1. -1, -2
          2. 结果
            1. 好像并不能 识别出来
            2. 感觉是 语法的问题
            3. 但是 书上 却没有写出来, 我感觉算是书上的错误
        2. 另一种表达
          1. 0-1, 0-2
          2. 结果
            1. 从 右边开始算下标

              1. 0-1 表示最后一位
              2. 0-2 表示倒数第二位
            2. ${str:0-2}
              1. 截取字符串最后两位
      2. 下标大于长度
        1. 返回空串, 也没有异常
    3. 建议

      1. 变量

        1. 避免使用 空变量, 空串
      2. 下标
        1. 避免使用 异常下标
    4. 我不想截取到结束, 怎么有办法吗?

      1. 当然有啦

例子3: 开始下标 和 指定长度

  1. 概述

    1. 尝试指定 开始下标 和 指定长度
  2. 脚本

    #!/bin/bash
    
    echo group1
    str="012345"
    echo ${str:0:1}
    echo ${str:1:1}
    echo ${str:1:2}
    echo ${str:0:6}
    echo ''
  3. 结果

    group1
    0
    1
    12
    012345
  4. 结论

    1. ${str:offset:length}

      1. offset

        1. 开始下标
      2. length
        1. 字串长度
      3. 结果
        1. 从开始下标开始, 截取长度为 length 的字串
  5. 疑问

    1. 我有办法知道字串多长呢?

      1. 定长的好说
      2. 变长的怎么办呢?
    2. 当然有啦

例子4: 字符串长度

  1. 概述

    1. 求 字符串长度 的方法
  2. 脚本


    #!/bin/bash
    echo group2
    echo ${#str}
    echo ${str:0:${#str}}
    echo ''
  3. 结果

    group2
    6
    012345
  4. 结论

    1. ${#str}

      1. 可以求出 str 的长度
      2. 可以嵌套在 ${str:offset:length} 中

其他: 问题

  1. 概述

    1. 其他的问题
  2. 问题

    1. offset

      1. 负数

        1. 常规负数

          1. -1, -2
          2. 没有效果, 感觉是 语法不支持
        2. 0-1, 0-2
      2. 大于长度
        1. 返回空串
    2. length

      1. 负数

        1. 结果不太正常, 不建议
      2. 大于长度
        1. 直接到字符串结尾
    3. 空变量/空串

      1. 没有异常, 没有返回
  3. 疑问

    1. 我想要根据特定字符, 来做 截取, 有办法吗?

      1. 当然有啦

3. 模式匹配与截取

  1. 概述

    1. 截取的另一种思路
  2. 目的

    1. 从根据 特定关键字截取

      1. 给定特定模式
      2. 删除符合模式的内容, 返回余下内容
  3. 问题

    1. 匹配方向

      1. 左边开始
      2. 右边开始
    2. 匹配策略
      1. 不贪婪
      2. 贪婪
    3. 匹配内容
      1. 模式, 通配符

例子1: 从头匹配

  1. 概述

    1. 从头开始匹配
  2. 脚本

    #!/bin/bash
    
    str="abcdabcdabcd"
    
    echo group1
    echo ${str}
    echo ${str#*bc}
    echo ${str##*bc}
  3. 结果

    group1
    abcdabcdabcd
    dabcdabcd
    d
  4. 结论

    1. ${str#pattern}

      1. 格式

        1. str 是需要截取的源字符串
        2. pattern 是 模式串
    2. 关注点

      1. 匹配方向

        1. # 是 从左往右
      2. 匹配策略
        1. # 不贪婪

          1. 最短模式串
        2. ## 贪婪
          1. 最长模式串
      3. 模式
        1. 类似通配符

          1. ? 表示单个字符
          2. * 表示多个字符
          3. [] 可以有 字符集合
        2. 不是正则
          1. 不是正则
          2. 不是正则
  5. 疑问

    1. 是否可以从后往前匹配呢?

      1. 当然可以啦

例子2: 从尾匹配

  1. 概述

    1. 从尾开始匹配
  2. 脚本

    #!/bin/bash
    
    str="abcdabcdabcd"
    
    echo group1
    echo ${str}
    echo ${str%bcd*}
    echo ${str%%bcd*}
  3. 结果

    group1
    abcdabcdabcd
    abcdabcda
    a
  4. 结论

    1. ${str%pattern}

      1. 格式

        1. str 是需要截取的源字符串
        2. pattern 是 模式串
    2. 关注点

      1. 匹配方向

        1. % 是 从右往左
      2. 匹配策略
        1. % 不贪婪

          1. 最短模式串
        2. %% 贪婪
          1. 最长模式串
      3. 模式
        1. 同 从左往右

其他

  1. 其他注意事项

    1. 如果没匹配到

      1. 那就没有结果
    2. 理解

      1. 可以借用 括号

        1. 假设我有 这么个串 "1 + ( 2 + ( 3 + 3 ) + 2 ) + 1"

          1. 删除左边, 通常用 *(
          2. 删除右边, 通常用 )*
        2. 边界

          1. 边界也会被删除
          2. 如果需要边界, 记得自己补上

ps

  1. ref

    1. 学习 bash
  2. 疑问: 是否有从 shell 中获取特定字符的下标

    1. 需求

      1. 给定字符串 str
      2. 给定特定字符 s
      3. 获取获取 s 在 str 中的位置
    2. 寻找结果

      1. 貌似没有找到
    3. 其他

      1. 可以确定 str 里是否包含 s

        1. shell 判断字符串是否包含另一个字符串
      2. 可以根据 s 做截取
      3. 可以根据 s 做替换
        1. 这个后面讲
    4. 疑问

      1. 获取 s 在 str 里的下标, 目的到底是什么

        1. 截取
        2. 替换
        3. 根据下标位置, 精准划分, 从而确定行为?
  3. 其他

    1. 这么点破事, 感觉写的 有点长 啊

Linux - Shell - 字符串截取的更多相关文章

  1. Linux shell字符串截取与拼接

    一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1  # 号截取,删除左边字符,保留右边字符. echo ${va ...

  2. Linux 的shell 字符串截取很有用。有八种方法。

    一 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.linuxidc.com/123.htm 1  # 号截取,删除左边字符,保留右边字符. echo ${va ...

  3. linux shell 字符串操作(长度,查找,替换)详解

    linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...

  4. Linux 的字符串截取方法(转)

    Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. echo ${var#*//} ...

  5. linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...

  6. shell 字符串截取

    ${expression}一共有9种使用方法. ${parameter:-word},如果parameter为空,则用word的值做parameter的缺省值 ${parameter:=word},在 ...

  7. 【转】shell字符串截取

    shell字符串的截取的问题: 一.Linux shell 截取字符变量的前8位,有方法如下: 1.expr substr “$a” 1 8 2.echo $a|awk ‘{print substr( ...

  8. linux shell 字符串操作

    转:http://justcoding.iteye.com/blog/1963463 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作 ...

  9. Shell字符串截取

    shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...

随机推荐

  1. 基于element-ui 模仿微信聊天页面以及滚动条隐藏在chrome和其他浏览器的处理

    1.效果图 2.代码 <template> <div style=" overflow: hidden;"> <el-row> <el-c ...

  2. MySQL概述及入门(一)

    MySql概述及入门(一) 什么是MySQL?    MySQL是当今主流的关系型数据库管理系统(记录是有行有列的数据库) , 可以与Oracle 和SQL Server 竞争 , 是最好RDBMS( ...

  3. NAS之NFS/CIFS

    NAS之NFS 为集群中的 Web Server 配置后端存储 NFS:Network File System 网络文件系统,Unix系统之间共享文件的一种协议NFS 的客户端主要为Linux支持多节 ...

  4. win10自带邮箱如何使用?win10自带邮箱如何同步qq邮箱邮件?

    win10自带邮箱如何使用? 相信很多小伙伴在登录win10自带的邮箱登录QQ邮箱时,显示同步失败或者登录超时,但又找不到相关的资料,下面是我自己邮箱的操作流程,小伙伴可以尝试一下,有什么问题留言即可 ...

  5. LNMP环境配置(2)

    php-fpm配置,Nginx配置 Nginx配置 默认虚拟主机 修改主配置文件 # vi  /usr/local/nginx/conf/nginx.conf 在最后 } 符号上面写入  includ ...

  6. #AcWing系列课程Level-2笔记——2. 归并排序算法

    归并排序算法 编写归并排序,记住下面的思路,代码也就游刃有余了! 1.首先确定数组的中间位置的分界点(下标),也就是mid=(left+right)>>1,分成left,right两段. ...

  7. 网络流最大流——dinic算法

    前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...

  8. Elasticsearch + Kibana 简单安装使用

    1.资料来源官网,参考: https://www.elastic.co/cn/downloads/elasticsearch https://www.elastic.co/cn/downloads/k ...

  9. BSP与HAL关系(转)

    板级支持包(BSP)(Board Support Package)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件 ...

  10. Java设计模式(四)工厂方法模式

    定义与类型 定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行. 类型:创建型 适用场景 创建对象需要大量重复的代码 客户端(应用层)不依赖于产 ...