shell中sed学习之替换 \1 \2 \3的几点谜思

shell之正则表达式及三剑客sed命令 Shell三剑客之sed命令 阅读详情

     今天在学习shell时,无意中碰到了这样一个脚本,其中有行用到了sed

 

echo “111(222)333" | sed 's/(\(.*\))(.*)/\2\2\2/'
     看完后,百思不得其解,因为本人目前只是对shell略懂皮毛,只知道基本的语法格式。然后就百度,终于明白了这是怎么一回事。

     按上面这个例子,在sed替换语句那里,有两个表达式,(\(.*\)) 和 ( .* ),其中前一个有时有转义符,有时没有,表示,有转义符时,表示正则表达式 POSIX 的基本正则表达式 ( BER )引擎的字符组,表示里面的内容会出现,如果里面有多个内容,则至少会出现一个,这里,里面是 .*,点通配符  . 表示可以匹配除换行符之外的任意单个字符,而 * 表示可以出现任意多次,包括依次都不出现。

    而前面没加转义符的一队双括号其实可以理解为一个标志,因为 echo 后面的语句有一对双括号,这是 sed 后的语句的双括号正好与之配对。所以,sed 后的替换语句中, ( \( .*\))表示的就是(222),而着后面的 (. *) 就是表示(222) 厚的所有内容。而后面的 \2表示的是这两个部分的第二个部分,即 (.*), 这里用到了三个 \2, 则会将这个部分重复三次,而前面的部分 111 没有影响,会直接输出,所以整个输出就是:

    111333333333。

    如果此处将  \2 改为 \1, 则会将 222 重复出现三次, 结果为 111222222222。


   当然,echo 语句中的括号我可以换成别的,如 111y222y333,那么,要得到相同的输出,则应该这么改写语句:

 

 echo "111y222y333" | sed 's/y\(.*\)y(.*)/\2\2\2/'

  两个括号及其以上得情况:

[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC)no4=(DDD)" | sed 's/\(.*\)(\(.*\)).*/\2/'

DDD
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC)no4=(DDD)" | sed 's/.*(\(.*\)).*/\1/'
DDD
以上两句意义相同。
我们本想取到AAA,但是为什么取了DDD呢
正则表达式是有贪婪性的,它总是与最长的可能长度匹配,而且越是排在前面的通配符优先级越高。按照这样的原则取到得就是DDD了,那么我们应该如何取得AAA呢?

我们考虑如果在模式串中第一个.*中告诉sed这个.*是不能含有"("的,同时第二个.*中不能含有")"应该OK吧
试一试:
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC)no4=(DDD)" | sed 's/[^(]*(\([^)]*\)).*/\1/'
AAA

以此类推,可以得到
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC)no4=(DDD)" | sed's/[^(]*(\([^)]*\))[^(]*(\([^)]*\))[^(]*(\([^)]*\))[^(]*(\([^)
]*\))/\2/'
BBB
将2改为3就是CCC
将3改为4就是DDD

  上面这段是博客 点击打开链接,因为以目前所学的水平,还体会不了这段的意思,特摘来提醒自己,要继续学习,勤于思考,争取早日将这个问题弄懂。


   以上文章是写于2014-09-20 10:18,当时没弄懂上面一个问题,现在经过继续的学习,终于搞明白了。


      还是用上面 echo 语句输出的字串,当我本来想用 sed 输出 AAA 时,却还是输出 DDD。这是由于正则表达式的贪婪性。正如上面说的,正则表达式总是与最长的可能长度匹配,而且越是排在前面的通配符优先级越高,我们来看 sed语句:

 

sed 's/.*(\(.*\))/\1/'
    第一个通配符 .* 优先级较第二个高,它会匹配可能的最大长度,即匹配字串 ”no1=100(AAA) no2=100(BBB) no3=100(CCC)no4= “,所以当你输出 括号内匹配的第一个内容时,就会输出 DDD。怎么解决这个问题呢?请看下面分解:

    由于贪婪行,使得输出结果有误。让我们仔细看上面那个字串,不是有四个括号吗!我要输出 AAA,即是输出第一个括号的内容,所以只要我能匹配到第一个括号,那不就完美的解决了这个问题吗。实际上,也就是如此。

    那么,怎么来匹配第一个括号呢?

    看字串里,要想匹配括号内的数据,会用正则表达式  (\(.*\)),要想第一个呢?那么,我们只要在匹配括号内的内容时,让它前面不要出现  左双括号 “(”  不就可以了吗!所以,问题的关键就在这里。我们可以用下面的正则表达式来达到这一目的:

sed 's/[^(]*(\(.*\)).*/\1/'

    这样,输出就可以得到 AAA 了。

    那么,如果我想得到 BBB ,CCC,怎么办呢?

    这个问题就留给读者来回答吧!


shell脚本:sed sed(Stream Editor)是一个强大的文本处理工具,主要用于对输入流(文件或管道数据)进行批量编辑操作,如替换、删除、插入、打印等。sed的核心是通过模式匹配和命令操作处理文本,常用场景包括日志分析、配置文件批量修改、文本格式化等。其语法简洁但功能强大,结合正则表达式可实现复杂的文本处理需求。 阅读详情

相关推荐

FOC无刷电机磁编码器机械角度与电角度自动对齐校准及电机极对数自动获取的方法

本文提出磁编码器机械角度与电角度自动对齐校准方法及电机极对数自动获取方案。通过通直流电流使转子定向,读取机械角度并计算电角度偏移量,实现精确对齐;同时利用低速旋转时检测反电动势过零点次数,结合机械角度变化量自动计算极对数。核心算法包括转子定向、偏移量计算、极对数推导等步骤,并提供了基于STM32的C语言实现代码。该方法适用于工业伺服、机器人等高精度控制场景,需注意负载安全、参数调整和误差处理。两种自动化流程可有效解决电机安装调试中的角度对齐和参数识别问题。

qq_29653575的博客 2482

shell编程基础:sed命令的使用

sed -i 就是直接对文本文件进行操作的。

yuxuan89814的专栏 456

51单片机基础知识

前言 周末闲着无聊,以后定时更新一期关于51单片机的学习案例,以供大家平时参考使用。至于单片机,你可以理解为人的大脑,而人各项身体器官的运作需要意识给到大脑,然后大脑再驱动我们的中枢神经进行相应的动作,这里的意识可以理解为我们要写的程序,而人的器官相当于各种输出设备,例如我们以后要学的LED、电机、各种传感器等等。学好单片机能让你找到一份相对不错的工作,当然越可观的东西也是要付出相应努力的。 一、51单片机是什么? 通常我们一说到 51 单片机,指的都是兼容IntelMCS-51体系架构的一系列单片机,而

qq_43537819的博客 6903

sed 之 \1-9 的作用

sed 之 \1-9 的作用 \1 就代表被匹配到的第一个模式,sed 一共可以记录9个模式。这些模式在某些场景下会非常有用,下面就介绍一下怎样使用。 模式? 就是正则表达式用 () 扩起来的内容 命令行模式下用到了转义字符 \( 和 \) 先看一行命令: [www@]$ echo hello123|sed "s/\([a-z]*\).*/\1/" hello这里我们看到的是正则匹配到的部分是

Jasonliujintao的博客 1万+

格(Lattice)基础(一)

有关格的基础概念,和相关的格难题

Amire0x的小乐园 5698

寒假实训笔记day01——认识M4单片机之STM32F405RGT6

认识M4单片机之STM32F405RGT6(含义、规格、参数)

weixin_47200070的博客 8551

sed命令全面解析

作用 sed命令是一个非交互式的行文本编辑器,它能对文件内容进行编辑,默认每次处理文本文件中所匹配到一行内容到模式空间,然后用后面的命令进行操作,操作完成之后,会把模式空间里面的内容输出到屏幕上,然后把模式空间中的内容删除,同时把下一行所匹配到的内容读入模式空间内,依次循环,直到读取完整个文件。 sed 命令处理的是缓冲区中的内容,其实这里的缓冲区,就是模式空间 语法 sed [options]'address command'file sed [options] -f [scripefile]..

wht1995316的博客 8124

37、半导体硅材料中的缺陷与吸杂技术解析

本文系统解析了半导体硅材料中的缺陷形成机制及其对电子器件性能的影响,重点探讨了生长和工艺诱导缺陷、表面与内部微缺陷的起源与特征。文章详细阐述了吸杂技术的原理、过程及在集成电路和太阳能电池制造中的应用,强调通过氧行为调控和热处理优化实现缺陷控制。同时介绍了吸杂效果的评估方法,并展望了未来新型吸杂技术的发展趋势,为提升半导体器件性能和制造良率提供理论支持和技术路径。

mongodb5scout的博客 162

我觉得是全网最全最好最有用的sed命令详解+示例

看了太多关于sed的介绍,但我觉得这篇写的最好,只看这一个就够了。本文对原文未做任何修改,只是重新排版。 感谢原做者rick_grace 原方链接:https://blog.youkuaiyun.com/jsut_rick/article/details/78287737 sed命令解析 sed(Stream EDitor),流式编辑器 非交互式,基于模式匹配过滤及修改文本 //类比:Vi...

kim5659的博客 3628

光学传播仿真软件:SPEOS_(14).建筑物内光环境仿真

在建筑物内光环境仿真中,材料属性的定义直接影响光的传播和反射效果。SPEOS提供了丰富的材料库,但也可以自定义材料属性以满足特定需求。创建新材料选择Materials->。输入材料名称和类型。配置材料属性选择材料对象,打开属性编辑器。设置反射率、透射率、表面粗糙度和颜色。# 导入SPEOS模块# 创建新材料# 配置材料属性custom_material.set_reflectivity(0.8) # 设置反射率为0.8。

kkchenjj的博客 1245

ONNX Runtime C# YOLO全链路压测:从300ms到22ms的15个底层优化技巧

摘要:本文分享了工业质检场景下C#调用YOLOv8s ONNX模型的性能优化实战经验。原始单帧推理耗时300ms无法满足产线需求,通过全链路分析定位瓶颈(预处理85ms、推理180ms、后处理30ms)。重点优化措施包括:使用OpenCVSharp CUDA加速预处理(85ms→12ms),开启ONNX Runtime ALL级别图优化,选用TensorRT执行提供程序(180ms→22ms),以及优化内存管理和线程调度。最终实现单帧总耗时22ms±2ms,GPU利用率提升至85%,完整满足产线120块板/

2601_94871597的博客 402

sed替换特殊字符

shell脚本经常会使用替换操作,sed用处很广,下列集中对一些使用场景做出总结: 1. 普通操作可以使用冒号(:)井号(#)正斜杠(/)来作为分隔符: eg: sed -i 's#abc#def#g' geng.file ---将文件geng中的abc替换成def cat geng.file | sed 's/abc/def/g' ---打印文件geng,并将其中的abc替换成def 2. 对于变量做替换 sed 若是单引号括起来的,变量上得再额外加个单引号...

genghongsheng的博客 5万+

基于DSIFT多尺度图像融合的MATLAB代码

多尺度图像融合是一种常用的图像处理技术,它可以将具有不同尺度和空间频率特征的图像融合成一幅更具信息丰富度和视觉效果的图像。DSIFT算法是一种基于SIFT算法的改进版本,它在提取图像特征时采用了密集采样的方法,能够有效地提取图像的局部特征。多尺度图像融合基于DSIFT算法的思想,通过在不同尺度下提取图像的DSIFT特征,并将这些特征进行融合,得到最终的融合图像。然后,通过DSIFT算法提取了两幅图像的特征。通过运行上述代码,我们可以在MATLAB中实现基于DSIFT多尺度图像融合的算法,并观察到融合结果。

IELLQUI9的博客 180

shell-18-sed 的替换功能, ( )和\1 , ( )与&

sed 的替换功能 —— sed ‘ s/ 替换前 / 替换后 / g ’ 文件名 这种替换不会真实改变文件 g是匹配到的项全部替换 替换后会自动全文打印,不止是匹配项的行 指定行号范围内进行的替换 —— sed ‘ 行号范围 s/ 替换前 / 替换后 /g ’ 替换第1行至第10行内的 root 全部成 toor 正则表...

桑 3458

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

shell 文件内容替换 sed用法

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!                调用sed命令有两种形

ytffhew的博客 1403

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Shell sed命令

遇到sed问题,经常会去查资料,这里自己记录一下,方便以后查询。 sed(流编辑器)命令行文本编辑器。它一次处理一行内容,先把处理的行存入临时缓冲区(模式空间)进行处理,用sed命令处理缓冲区内容后输出到屏幕。能同时处理多个文件多行的内容,不改变原文件内容。最常用的是模式匹配和替换操作。 官网文档 命令格式 sed [选项]... {脚本} [输入文件]... sed [op...

L, there! 3144

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

shell 文件内容替换 sed用法

调用sed命令有两种形式: sed [options] 'command' file(s) sed [options] -f scriptfile file(s)   删除:d命令  $ sed '2d' example-----删除example文件的第二行。 $ sed '2,$d' example-----删除example文件的第二行到末尾所有行。 $

jason的博客 1231

Shell 编程三剑客之Sed

文章目录引言一、Sed工具概述二、Sed基本语法三、Sed用法示例1、输出指定的行1.1 Sed命令输出指定行1.2 Sed结合正则表达式输出指定行2、插入符合条件的行3、删除符合条件的行4、替换符合条件的文本4.1 字符串替换4.2 先备份再修改数据5、迁移符合条件的文本6、使用脚本编辑文件四、Sed应用案例1、调整vsftpd服务配置2、修改DNS配置文件2.1 修改主配置文件2.2 修改区域配置文件2.3 修改区域数据配置文件五、总结 引言 在Linux/UNIX 系统中包含很多种类的文本处理器或文本

qq_45088125的博客 2153

linux shell之sed

目录1. 概述1.1 工作原理1.2 与vim的区别2. 基本语法2.1 选项2.2 示例2.2.1 多行删除2.2.2 正则匹配2.2.2 正则块匹配2.2.3 替换2.3 组合命令2.3.1 组合多条命令2.3.1 地址范围操作多条命令 sed(Stream Editor)是一款强大流式、非交互式的编辑器,集合正则表达式,可以对标准输出或者其他输出进行处理并输出。sed的强项是替换文本中的特定字符,而写shell有个步骤就是从一段文本中截取一段字符进行处理,所以熟练掌握sed命令是写shell脚本的基

iflink 2115

Linux中shell编程的sed命令

shell脚本虽然功能很多,但是它最常用的功能还是处理文本文件,尤其是在正常的业务操作流程场景中,比如检查日志文件、读取配置、处理数据等现象,虽然我们能够使用echo、cat、<<、>>、|等符号实现文件内容的操作,但是整个过程有些繁琐。所以我们需要一种更为轻便的文本编辑工具,sed就是其中的一种。简介sed(Stream EDitor) 属于一种数据流式的行文件编辑工具。

lsh0411的博客 864

sed c\命令,IP地址和16进制数互相转换等一些精彩shell代码

1. 首先是sed中的c\命令,这个命令和s/xxx/xxxx/g不同的是,使用c\能把当前sed查找到的一行全部替换成我们指定的TEXT  比如 sed -i "/734/c\Hello" install.log ,这样就把包含有734这样字符串的整个一行替换成了Hello  在使用c\的时候需要注意,如果我们在c\命令后面加的不是一个常数字符串,而是一个变量,那么,要再加一个\

lyd518的专栏 6382

Linux Shell-sed替换“/”“\”

1 场景 使用sed替换“/”“\”,脚本该如何写? 2 分析 sed常用的方式是: sed 's/a/b/g' 含义是,在全局内,将a替换为b,这个直接简单快速;但是当面对转义符号时,需要特别处理: 当需要替换\为\\时: reg="$( echo "${reg}" | sed 's/\\\/\\\\\\\/g' )" 当需要替换/为\/时: reg="$( echo "${reg}" ...

adamaday的专栏 1万+

linux sed替换行,shell - 使用Sed替换包含字符串的整行

shell - 使用Sed替换包含字符串的整行我有一个文本文件,其中有一个特定的行sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext我需要替换上面的整行This line is removed by the admin.搜索关键字是sed我需要为此编写一个shell脚本。 我如何使用sed实现这一目标...

weixin_34378126的博客 5522

shell 三剑客(grep,sed,awk)学习

shell语法中,grep:擅长查找和匹配文本;awk:擅长编辑和匹配文本内容;sed:删除格式化文本内容,对文本进行复杂处理

小青头的博客 990
上一篇: shell终端显示彩色字体或彩色背景
下一篇: 如何修改root命令
LinuxIPLinux
博客等级 码龄12年 2粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值