专栏首页给永远比拿愉快Shell脚本中字符串的一些常用操作

Shell脚本中字符串的一些常用操作

Shell脚本中字符串的一些常用操作

字符串长度

${#string}可以获得${string}的长度

例子:

string='How are you'
echo ${#string}  # 输出结果为11

字符串取子串

${string:position:length} 在${string}中, 从位置${position}开始提取长度为${length}的子串

例子:

string='How are you'
echo ${string:4:3}  # 索引从0开始,输出结果为:are
echo ${string:4}  # 省略长度,默认提取至最末尾,输出结果为:are you

字符串截取(不匹配字符)

符号

含义解析

${string#substring}

从变量${string}的开头, 删除最短匹配${substring}的子串

${string##substring}

从变量${string}的开头, 删除最长匹配${substring}的子串

${string%substring}

从变量${string}的结尾, 删除最短匹配${substring}的子串

${string%%substring}

从变量${string}的结尾, 删除最长匹配${substring}的子串

我们可以总结一下规律:

换句话来说,#总是表示左边算起,%总是表示右边算起;一个符号表示最短匹配,两个符号表示最长匹配。

我们可以利用该特点做一些有意义的事情,下面举几个例子:

# 定义字符串
f=$(realpath 空间数据处理环境搭建.pdf)
# 输出该字符串变量的值,结果为/Users/tanzhenyu/Resources/Books/Python空间数据处理实战/空间数据处理环境搭建.pdf
echo $f
# 第一件事情:提取文件名称,输出结果为:空间数据处理环境搭建.pdf
echo ${f##*/}
# 第二件事情:提取文件扩展名,输出结果为:pdf
echo ${f##*.}
# 第三件事情:提取父目录,输出结果为:/Users/tanzhenyu/Resources/Books/Python空间数据处理实战
echo ${f%/*}

当然,Shell编程中我们也可以使用basenamedirname两个命令分别提取文件名和父目录名称:

# basename提取当前文件或者当前目录名称,输出结果为:空间数据处理环境搭建.pdf
echo $(basename $f)
# dirname提取父目录名称,输出结果为:/Users/tanzhenyu/Resources/Books/Python空间数据处理实战
echo $(dirname $f)

子串替换

符号

含义解析

${string/substring/replacement}

使用${replacement}, 来代替第一个匹配的$substring

${string//substring/replacement}

使用${replacement}, 代替所有匹配的$substring

${string/#substring/replacement}

如果${string}的前缀匹配${substring}, 那么就用${replacement}来代替匹配到的${substring}

${string/%substring/replacement}

如果${string}的后缀匹配${substring}, 那么就用${replacement}来代替匹配到的${substring}

注:${substring}可以是一个正则表达式.

例子:

# 把Windows的路径换成类UNIX的路径
f='C:\Windows\system32\cmd.exe'
echo ${$f//\///}
# 输出结果为:C:/Windows/system32/cmd.exe

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 正则表达式构造

    正则表达式是正则表达式引擎尝试匹配输入文本的一种模式。 模式由一个或多个字符文本、运算符或构造组成。

    卡尔曼和玻尔兹曼谁曼
  • PostGIS导入导出ESRI Shapefile数据

    PostGIS作为PostgreSQL数据库的空间扩展,提供了对空间数据管理的支持。对于空间矢量数据,PostGIS提供了Geometry和Geography俩...

    卡尔曼和玻尔兹曼谁曼
  • 假设检验和P值那些事

    记得大学时候学习概率论与数理统计的时候,学习过假设检验,但我不记得课本上有提到过P值。后来翻阅了一些资料,大概弄明白了它们之间的关系,本文旨在以浅显易懂的语言描...

    卡尔曼和玻尔兹曼谁曼
  • 『Go 内置库第一季:error』

    Go 中的错误处理和别的语言不一样,设计哲学也不一样,常有开发者埋怨 Go 语言中的错误处理。

    谢伟
  • Mysql 常用函数(5)- substring 函数

    https://www.cnblogs.com/poloyy/p/12890763.html

    小菠萝测试笔记
  • linux\mac 日常入门命令行使用——搜索文件\文件夹

    linux\mac 日常入门命令行使用——搜索文件\文件夹 搜索文件或者文件夹,是一个常见的需求。我们可以用多种命令来实现我们的需求。 find 命令实现搜索 ...

    FungLeo
  • 吴恩达深度学习课最新补充教程:交互式demo助你轻松理解神经网络初始化

    这篇教程共包括四部分:有效初始化的重要性、梯度爆炸或消失问题、什么是恰当的初始化,以及 Xavier 初始化的数学证明。

    用户2769421
  • 吴恩达深度学习课最新补充教程:交互式demo助你轻松理解神经网络初始化

    这篇教程共包括四部分:有效初始化的重要性、梯度爆炸或消失问题、什么是恰当的初始化,以及 Xavier 初始化的数学证明。

    机器之心
  • 灵魂拷问:Java 的 substring() 是如何工作的?

    在逛 programcreek 的时候,我发现了一些小而精悍的主题。比如说:Java 的 substring() 方法是如何工作的?像这类灵魂拷问的主题,非常值...

    沉默王二
  • 吴恩达团队:神经网络如何正确初始化?

    初始化对训练深度神经网络的收敛性有重要影响。简单的初始化方案可以加速训练,但是它们需要小心避免常见的陷阱。

    AI科技大本营

扫码关注云+社区

领取腾讯云代金券