当前位置: 首页 > news >正文

2024年2月19日 - mis

当需要在两个或多个子模式间插入文本时,这个特性尤其有用。这里有个脚本,它使用子模式在大数字中插入逗号。

$ echo "1234567" | sed '{
> :start
> s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/
> t start
> }'
1,234,567
$

​ 这个脚本将匹配模式分成了两部分。
​ .*[0-9]
​ [0-9]{3}
​ 这个模式会查找两个子模式。第一个子模式是以数字结尾的任意长度的字符。第二个子模式
是若干组三位数字(关于如何在正则表达式中使用花括号的内容可参考第20章)。如果这个模式
在文本中找到了,替代文本会在两个子模式之间加一个逗号,每个子模式都会通过其位置来标示。
这个脚本使用测试命令来遍历这个数字,直到放置好所有的逗号。

正则表达式中的子模式“.*[0-9]”表示匹配任意长度的字符,以数字结尾。这是因为:

  1. 点号(.):在正则表达式中,点号(.)是一个特殊字符,它匹配除了换行符之外的任何单个字符。
  2. 星号(*):星号(*)是一个量词,表示前面的字符可以出现零次或多次。当它跟在点号后面时,就表示匹配任意长度的字符序列。注意:这里的星号会尽可能的多匹配字符。
  3. 字符集[0-9]:方括号内的范围表示一个字符集,匹配任何一个指定的字符。在这里,[0-9]表示匹配任何一个数字字符。

[0-9]{3} 是一个正则表达式的子模式,它匹配的是恰好由三个数字组成的字符串

  1. 字符集[0-9]:在正则表达式中,方括号[]用来定义一个字符集合,匹配任何一个指定的字符。这里的[0-9]表示匹配从0到9之间的任何一个单个数字字符。
  2. 量词{3}:花括号{}中的3是一个量词,表示前面的字符集[0-9]必须连续出现3次。

疑惑:循环两次的匹配,它到底应该先匹配哪个比较好,我的意思是可以有很多种情况,例如:第一次循环的时候可以是 1,234567 或 1234,567 或 12,34567 等等;所以要循环一次才可以看出来:

bobo@thj:~/Havefun$ echo "1234567" | sed '{
> s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/
> }'
1234,567
bobo@thj:~/Havefun$ echo "1234567f" | sed '{
s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/
}'
1234,567f
bobo@thj:~/Havefun$ echo "1234567f123" | sed '{
s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/
}'
1234,567f123
bobo@thj:~/Havefun$ echo "1234,567f123" | sed '{
s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/
}'
1,234,567f123

总结:他是从后面向前面匹配的,先找到最后连续的3个数字,然后向前找一位。感觉上像是在尽力照顾全局。(为什么要这样设计呢?)这是因为在正则表达式中,.*[0-9] 这部分会尽可能多地匹配字符,直到最后一个数字。

可是 为什么*要尽可能多匹配字符,而不是尽可能少的匹配字符呢? (然后发现还有贪婪匹配和非贪婪匹配这种东西😂)

​ 正则表达式中的 * 量词默认是贪婪的,这意味着它会尽可能多地匹配字符。这种设计的原因主要是为了提供一种默认的行为,使得在大多数情况下能够满足匹配的需求。贪婪匹配是一种最大化匹配策略,它尝试找到最长的可能匹配,这样可以确保表达式能够匹配到所有可能的情况。

然而,有时候我们可能需要最小化匹配,即匹配尽可能少的字符。在这种情况下,可以使用非贪婪匹配,通常是通过在量词后面加上一个问号 ? 来实现,如 *?+??? 等。这样,正则表达式引擎会在找到第一个可能的匹配后停止,不再继续寻找更长的匹配。


  • 命令n:小写的n是next命令的简写。这个命令会告诉sed编辑器移动到输入数据流中的下一行,而不用重新执行当前行上的所有命令。通常sed会在处理当前行之前的所有命令后,再移动到下一行。但使用n命令可以改变这一流程,使得sed在处理完当前行上的某个特定命令后即刻移动到下一行。
  • 命令N:大写的N用来将输入数据流中的下一行加到当前行之后,创建一个多行组。这对于处理跨多行的文本操作非常有用。当N命令执行后,它们会被视为一个整体来处理接下来的sed命令。

bobo@thj:~/Havefun$ nl data2.txt1  This is the header line.2  This is the first data line.3  This is the second data line.4  This is the last line.
bobo@thj:~/Havefun$
bobo@thj:~/Havefun$
bobo@thj:~/Havefun$ cat -n data2.txt1  This is the header line.2  This is the first data line.3  This is the second data line.4  This is the last line.
bobo@thj:~/Havefun$

bash shell 命令也可以添加行号,但是会有间隔。


那么,如何用美元符来显示数据流末尾的若干行呢?答案是创建滚动窗口。
滚动窗口是检验模式空间中文本行块的常用方法,它使用N命令将这些块合并起来。N命令将
下一行文本附加到模式空间中已有文本行后面。一旦你在模式空间有了一个10行的文本块,你可
以用美元符来检查你是否已经处于数据流的尾部。如果不在,就继续向模式空间增加行,同时删
除原来的行(记住,D命令会删除模式空间的第一行)。

通过循环N命令和D命令,你在向模式空间的文本行块增加新行的同时也删除了旧行。分支命
令非常适合这个循环。要结束循环,只要识别出最后一行并用q命令退出就可以了。

$ cat data7.txt
This is line 1.
This is line 2.
This is line 3.
This is line 4.
This is line 5.
This is line 6.
This is line 7.
This is line 8.
This is line 9.
This is line 10.
This is line 11.
This is line 12.
This is line 13.
This is line 14.
This is line 15.
$
$ sed '{
> :start
> $q ; N ; 11,$D
> b start
> }' data7.txt
This is line 6.
This is line 7.
This is line 8.
This is line 9.
This is line 10.
This is line 11.
This is line 12.
This is line 13.
This is line 14.
This is line 15.

如果是最后一行的话就退出,然后将下一行添加到模式空间中去,接着继续执行下面的命令,然后检查这一行是不是11行到最后一行,如果是的话,就删除模式空间的第一行;如此循环处理每一行,因为一共是15行,所以会删除前面5行。


$ cat data8.txt
This is line one.This is line two.This is line three.This is line four.
$
$ sed '/./,/^$/!d' data8.txt
This is line one.This is line two.This is line three.This is line four.
$

,:表示范围操作符,这里指从匹配第一个模式的行开始到匹配第二个模式的行结束,期间的所有行都将作为一组处理。区间是/./到/^$/。区间的开始地址会匹配任何含有至少一个字符的行。区间的结束地址会匹配一个空行。在这个区间内的行不会被删除。(为什么最后一行就不会删除呢,逆天!!!)


$ cat data10.txt
This is the first line.
This is the second line.$ sed '{
> :start
> /^\n*$/{$d ; N ; b start }
> }' data10.txt
This is the first line.
This is the second line.
$

这就删除了最后两行了,大写的疑惑?

我们来分析一下,将删除命令改为打印命令,看看是如何循环的:

bobo@thj:~/Havefun$ cat data10.txt | sed '=' | sed 'N; s/\n/ /'
1 This is the first line.
2 This is the second line.
3
4
5
bobo@thj:~/Havefun$ sed '{
:start
/^\n*$/{$p ; N ; b start }
}' data10.txt | sed '=' | sed 'N; s/\n/ /'
1 This is the first line.
2 This is the second line.
3
4
5
6
7
8
bobo@thj:~/Havefun$

首先注意一个问题:sed 编辑器默认情况下并不支持模糊匹配,它采用的是正则表达式进行精确或基于模式的匹配操作

先看前两行,没有被p 命令打印,说明不满足匹配条件;但是我感觉后面三行是整体打印的。

相关文章:

2024年2月19日 - mis

当需要在两个或多个子模式间插入文本时,这个特性尤其有用。这里有个脚本,它使用子模式在大数字中插入逗号。 $ echo "1234567" | sed { > :start > s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/ > t start > } 1,234,567 $​ 这个脚本将匹…...

【JavaWeb】网上蛋糕商城-项目搭建

学习目标 了解网上蛋糕商城的项目需求 了解网上蛋糕商城的功能结构 熟悉E-R图和数据表的设计 熟悉项目环境的搭建 通过前面章节的学习,相信读者应该已经掌握了Web开发的基础知识,学习这些基础知识就是为开发Web网站奠定基础。如今,电子商…...

【Flink状态管理五】Checkpoint的设计与实现

文章目录 1. Checkpoint的整体设计2. Checkpoint创建源码解析2.1. DefaultExecutionGraphBuilder.buildGraph2.2. ExecutionGraph.enableCheckpointing 由于系统原因导致Flink作业无法正常运行的情况非常多,且很多时候都是无法避免的。对于Flink集群来讲&#xff0c…...

How to install a specific version of a package in R

How to install a specific version of a package in R 在使用R语言完成数据分析的过程中,很多时候,因为项目实际需要,我们应该指定某些库文件的安装包的版本,这个时候,我们可以基于devtools包中的函数install_version…...

SIGSEGV 段错误

SIGSEGV是在Unix/Linux系统中表示"Segmentation Fault"(分段错误)的信号。当一个进程访问未分配给它的内存、访问超出其内存边界或者访问不允许的内存区域时,就会产生SIGSEGV信号,导致进程被操作系统终止。 SIGSEGV的常…...

OpenCV 4基础篇| OpenCV简介

目录 1. 什么是OpenCV2. OpenCV的发展历程3. 为什么用OpenCV4. OpenCV应用领域5. OpenCV的功能模块5.1 基本模块5.2 扩展模块5.3 常用函数目录 1. 什么是OpenCV OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它…...

Vue常用内置指令,代码Demo演示和讲解

文章目录 一、v-text二、v-html三、v-bind四、v-model五、v-on六、v-show七、v-if、v-else八、v-for九、v-cloak 一、v-text 作用&#xff0c;更改标签的显示值使用 v-text 会读取 data中的变量值如果变量存在替换原来的值&#xff0c;如果不存在则报错 <!DOCTYPE html>…...

Spring设计模式之工厂模式创建Bean对象

BeanFactory和Application是Spring容器中创建和管理Bean对象的接口&#xff0c;但是它们的实现方式不同。 BeanFactory&#xff1a; BeanFactory采用延迟初始化策略&#xff0c;只有应用程序向容器请求特定的Bean时才创建该Bean对象。它的启动速度很快&#xff0c;但在程序运…...

Elasticsearch 别名(Aliases)的作用

Elasticsearch 8.4.3 别名&#xff08;Aliases&#xff09; 一. 介绍二. 别名的优势三. 别名的基本操作3.1 创建别名3.2 查询别名关联的索引3.3 删除别名3.4 更新别名3.5 通过别名查询数据 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接…...

基于vue的个性化推荐餐饮系统Springboot

项目&#xff1a;基于vue的个性化推荐餐饮系统Springboot 摘要 现代信息化社会下的数据管理对活动的重要性越来越为明显&#xff0c;人们出门可以通过网络进行交流、信息咨询、查询等操作。网络化生活对人们通过网上购物也有了非常大的考验&#xff0c;通过网上进行点餐的人也…...

量子计算:数据安全难题

当今数字技术面临的最大挑战之一是安全系统和数据。为此&#xff0c;人们设计了复杂的算法来加密数据并通过称为对称加密的框架来保护数据。虽然这已被证明是成功的&#xff0c;但量子计算的进步&#xff08;利用量子力学比传统计算机更快地解决复杂问题&#xff09;可能会彻底…...

CCF-B类SGP‘24 4月10日截稿!速速行动!

会议之眼 快讯 第22届SGP(Eurographics Symposium on Geometry Processing)即欧洲图形学几何处理专题讨论会将于 2024 年 6月24 -日至26日在美国麻省理工学院举行&#xff01;SGP是传播几何处理新研究想法和尖端成果的首要学术会议。作为该领域的重要学术盛事&#xff0c;SGP会…...

阿里云服务器安装MySQL、Apache、PHP

节日期间突然想要自己搭建一个个人网站&#xff0c;于是在阿里云申请了一个可以免费使用3个月的服务器&#xff0c;申请的云市场产品Wordpress平台&#xff08; ALinux3 LNMP PHP7.4&#xff09;。官方教程使用的CentOs系统&#xff0c;和我申请的ALinux3操作有一些差异&#x…...

Rust基础拾遗--并发和异步编程

Rust基础拾遗 前言1.并发1.1 分叉与合并并行1.1.1 启动与联结1.1.2 跨线程错误处理1.1.3 跨线程共享不可变数据1.1.4 rayon 1.2 通道1.2.1 发送值1.2.2 接收值1.2.3 运行管道1.2.4 通道的特性与性能1.2.5 线程安全&#xff1a;Send与Sync 1.3 共享可变状态 2.异步编…...

Javascript怎么输出内容?两种常见方式以及控制台介绍

javascript是一种非常重要的编程语言&#xff0c;在许多网页中它被广泛使用&#xff0c;可以实现许多交互效果和动态效果。输出是javascript中最基本的操作之一&#xff0c;下面将介绍两种常见的输出方式。 一、使用console.log()函数输出 console.log()函数是常用的输出函数…...

机器人路径平滑——线性插值

C++代码 //要实现平滑二维曲线的算法,你可以使用贝塞尔曲线或B样条曲线。下面是一个使用B样条曲线的C++算法的示例:#include <iostream> #include <vector> #include <fstream> #include <iomanip>...

2024-2-21-多线程基础作业

作业&#xff1a; 源代码&#xff1a; #include <myhead.h> #define MAXSIZE 64 //定义要传递的结构体类型 struct Info {const char *src;const char *dest;int len; }; int get_file_len(const char *srcfile, const char *destfile) {//以只读的形式打开源文件int sr…...

MySQL8的ONLY_FULL_GROUP_BY SQL模式兼容问题

文章目录 1. 问题描述2. 解决方法1. 修改查询2. 修改SQL模式3. 使用ANY_VALUE()函数 1. 问题描述 Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column btc-cloud.t1.id which is not funct…...

Django使用Celery异步

安装包 pip install celerypip install eventlet 1.在项目文件的根目录下创建目录结果 2. 在main.py文件中 # !/usr/bin/env python # -*-coding:utf-8 -*-""" # Author &#xff1a;skyTree # version &#xff1a;python 3.11 # Description&#…...

vue3 + ts + echart 实现柱形图表

首先封装Echart一个文件 代码如下 <script setup lang"ts"> import { ECharts, EChartsOption, init } from echarts; import { ref, watch, onMounted, onBeforeUnmount } from vue;// 定义props interface Props {width?: string;height?: string;optio…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...