在Bash中如何提取子字符串

问题:

对于形如 someletters_12345_moreleters.ext 的文件名,我想提取其中的5位数字并将它们放入一个变量中。

明确一下细节,一个文件名的形式是若干个字符(不包含下划线),跟着一个五位的数字,数字两边都有一个下划线,最后跟着另一组若干个字符(不包含下划线)。我想要提取这个5位数字并将它存入一个变量中。

我非常感兴趣于完成这一目标的不同方法。


回答:

使用 cut 命令

number=$(echo 'someletters_12345_subsequentchars.ext' | cut -d'_' -f 2)
echo $number
  • cut 是一个文本处理工具,用于按指定分隔符截取文件中的字段。
  • -d '_' 参数指定使用下划线字符 (_) 作为字段分隔符。
  • -f 2 参数表示提取第二个字段(字段索引从1开始计数)。

使用 awk 命令

number=$(echo 'someletters_12345_subsequentchars.ext' | awk -F'_' '{print $2}')
echo $number
  • -F'_' 参数指定了输入文本的分隔符为下划线字符 (_),这意味着 awk 将依据下划线来划分输入行中的字段。
  • {print $2}awk 脚本的一部分,其中 $2 表示输入行中的第二个字段(字段编号从1开始)。

使用 Shell 参数扩展

input="someletters_12345_subsequentchars.ext"
tmp=${input#*_}
number=${tmp%_*}
echo $number
  1. tmp=${input#*_}: 这是 bash 中的参数扩展操作,# 符号在这里用于删除从左边开始匹配的第一个 _ 及其左边的所有字符。所以,tmp 变量将被赋值为 "12345_subsequentchars.ext",去掉了原字符串中从左开始的第一个 _ 及其之前的 someletters 部分。
  2. number=${tmp%_*}: 同样是 bash 的参数扩展操作,但这次 % 符号用于删除从右边开始匹配的第一个 _ 及其右边的所有字符。因此,number 变量将被赋值为 "12345",去掉了原字符串中从右开始的第一个 _ 及其之后的 subsequentchars.ext 部分。

使用 tr 命令

number=$(echo "someletters_12345_subsequentchars.ext" | tr -cd '[[:digit:]]')
echo $number
  • tr 是一个强大的字符转换命令,常用于替换或删除字符。
  • -c 参数代表 complement(补集),告诉 tr 命令对指定字符集之外的字符进行操作。
  • -d 参数代表 delete(删除),删除匹配到的字符。
  • '[[:digit:]]' 是一个 POSIX 正则表达式的字符类,它匹配任何十进制数字(0-9)。

使用 grep 命令

number=$(echo "$filename" | grep -oE '[[:digit:]]{5}' | head -1)
echo $number
  • grep 是一个文本搜索工具,这里使用了-o选项,它仅输出匹配到的模式而非整行内容。
  • -E 选项表示使用扩展正则表达式(ERE)。
  • '[[:digit:]]{5}' 是一个正则表达式,匹配连续的任意五个数字字符。
  • 因此,grep 会找出 $filename 中连续出现的任意五个数字,并只输出这些数字。
  • head 命令用于显示文件或流的前几行,默认情况下显示头10行,但这里使用了 -1 选项,表示只显示第一行。

总结起来,第一行命令的目的是从变量 $filename 所代表的字符串中找到第一个连续的五位数字序列,并将它存入 number 变量中。


参考:

  • stackoverflow question 428109
  • man cut
  • man awk
  • man tr
  • man grep
  • 3.5.3 Shell Parameter Expansion

相关阅读:

  • sh和Bash的区别
  • 2>&1是什么意思
  • 为什么我不能在脚本中使用“cd“来更改目录
  • 如何使用bash脚本并行运行多个程序
  • 为什么要使用xargs命令
  • 一文掌握全网最全文件操作命令!120+命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/556349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCL SAC_IA配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、可视化代码四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统计的比较分析,为直…

mid_360建图和定位

录制数据 roslaunch livox_ros_driver2 msg_MID360.launch使用fast-lio 建图 https://github.com/hku-mars/FAST_LIO.git 建图效果 使用python做显示 https://gitee.com/linjiey11/mid360/blob/master/show_pcd.py 使用 point_lio建图 https://github.com/hku-mars/Point…

如何在C++的STL中巧妙运用std::find实现高效查找

如何在C的STL中巧妙运用std::find实现高效查找 一、简介二、在那里吗?2.1、在未排序的元素上2.2、已排序元素 三、在哪里?3.1、在未排序的元素上3.2、已排序元素 四、应该在哪里?五、结论 一、简介 本文章旨在涵盖所有在STL中(甚至稍微超出&#xff0…

Eclipse 配置JDK版本,Eclipse Maven install 时使用的JDK版本

Eclipse配置JDK版本 Eclipse 配置JDK版本的地方? 在Eclipse中配置JDK版本的步骤如下: 打开Eclipse IDE。转到菜单栏并选择 “Window”(窗口)选项。在下拉菜单中选择 “Preferences”(首选项),或…

asp.net core 依赖注入后的服务生命周期

ASP.NET Core 依赖注入(DI)容器支持三种服务的生命周期选项,它们定义了服务实例的创建和销毁的时机。理解这三种生命周期对于设计健壯且高效的应用程序非常重要: 瞬时(Transient): 瞬时服务每次…

大型网站系统架构演化实例_3.使用服务集群改善网站并发处理能力

1.使用服务集群改善网站并发处理能力 使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去更换更强大的服务器,对大型网站而言,不管多么强大的服务器,对大型网站而言&…

算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径

1.什么是回溯算法? 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。其本质是穷举,穷举所有可能,然后选出我们想要的答案。 2.为什么要有回溯算法? 那么既然回溯法并不高效为什么还要用它呢? 因为有的问题能暴力…

第10章 物理安全要求

10.1 站点与设施设计的安全原则 假如没有对物理环境的控制,任何管理的、技术的或逻辑的访问控制技术都无法提供足够的安全性。 如果怀有恶意的人员获取了对设施及设备的物理访问权,那么他们几乎可以为所欲为,包括肆意破坏或窃取、更改数据。…

光伏工程施工前踏勘方案与注意事项

光伏工程是指利用光能发电的技术。随着清洁能源的发展,光伏工程在能源领域的应用越来越广泛。在进行光伏工程施工前,需要对施工现场进行踏勘,以确保施工能够顺利进行并达到预期的效果。 本文游小编带大家一起看一下探勘的方案和注意事项。 1…

设计模式胡咧咧之策略工厂实现导入导出

策略模式(Strategy Pattern) 定义: 定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。 本质: 分离算法,选择实现 应用场景 何时使用 一个系统有许多类,而区分他们的只是他们直接…

【赛题】2024年“华中杯”数模竞赛赛题发布

2024年"华中杯"数学建模网络挑战赛——正式开赛!!! 赛题已发布,后续无偿分享各题的解题思路、参考文献,帮助大家最快时间,选择最适合是自己的赛题。祝大家都能取得一个好成绩,加油&a…

Python数据可视化:散点图matplotlib.pyplot.scatter()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 Python数据可视化: 散点图 matplotlib.pyplot.scatter() 请问关于以下代码表述错误的选项是? import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y [2, 3, 5, 7,…

认识一下RAG

1.RAG技术背景与挑战 2.RAG的核心概念 3.RAG的工作流程与架构 4.RAG的优化方法 RAG的提出 •Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks是一篇重要的论文(2020年5月) •REALM: Retrieval-Augmented Language Model Pre-Training (2020)就将BERT预训练模…

libVLC Ubuntu编译详解

1.简介 有时候,windows上开发不满足项目需求,需要移植到linux上,不得不自行编译libvlc,编译libvlc相对而言稍微麻烦一点。 我使用的操作系统:Ubuntu20.04 查看系统命令lsb_release -a libvlc版本: 3.0.1…

CSS导读 (CSS的三大特性 上)

(大家好,今天我们将继续来学习CSS的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 五、CSS的三大特性 5.1 层叠性 5.2 继承性 5.2.1 行高的继承 5.3 优先级 小练习 五、CSS的三大特性 …

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境2、配置远程连接3、其他配置入口 跑新项目,有个confluent-Kafka-go的依赖在Windows上编译不通过,报错信息: undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持,选择让…

数据库设计的三范式

简单来说就是:原子性、唯一性、独立性 后一范式都是在前一范式已经满足的情况进行附加的内容 第一范式(1NF):原子性 存储的数据应不可再分。 不满足原子性: 满足原子性: 第二范式(2NF&#xf…

历史遗留问题1-Oracle Mysql如何存储数据、索引

在学习到Oracle redo和undo时,涉及到很多存储结构的知识,但是网上的教程都不是很详细,就去复习了一下mysql,感觉是不是开源的问题,Mysql的社区和知识沉淀远高于Oracle, 对于初学者很友好,我想请…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(5)——可控评估端到端评估

最后完结篇,文末有测试中发现的有趣现象,并附上了相关资料链接~ 5.可控评估 分两个阶段评估生成代理。我们从一个更加严格控制的评估开始,单独评估代理的响应,以了解它们是否在狭义上定义的上下文中产生可信的行为。然后,在我们对代理社区进行为期两天的端到端分析中,我…

初始C++

1. C关键字(C98) C总计63个关键字, C语言32个关键字 ps:下面我们只是看一下C有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再 细讲。 2. 命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,…