Linux学习之sed替换命令讲解

news2024/11/24 18:30:18

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810uname -r看到内核版本是3.10.0-957.el7.x86_64bash --version可以看到bash版本是4.2.46(2)
在这里插入图片描述

sed(sed strem editor)可以理解为行编辑器,但它并不直接编辑文本文件本身,其默认对原文件内容不做任何修改。sed在处理文件的时候,每次都会逐行把文件内容读取到内存中,然后使用特定的模式对读入的文件内容进行处理,这样的一段内存空间成为模式空间。
sed的两种处理方法:

把文本全部内容逐行读取到模式空间中,在模式空间中会有指定的模式,然后把读取到的行和模式空间中的模式做匹配.
读取文本时把符合模式条件的内容逐行读取到模式空间中,符合模式过滤条件的,则在模式空间中做相对应的编辑处理,把模式空间中的内容显示输出,不符合的则不做处理并直接按原样输出。

sed格式有两种,如下:

sed [OPTIONS]… ‘COMMAND’ [FILE]…
sed [OPTIONS] -f SCRIPTFILE [FILE]…

sed的替换命令是s,普通格式如下:

sed 's/oldstring/newstring/' filename,这个会把模式空间中匹配的第一个oldstring改成newstring,但是这个不会在原文件filename中操作。

sed -e 's/oldstring1/newstring1/' -e 's/oldstring2/newstring2/' filename,这个会把模式空间中匹配的第一个oldstring1改成newstring1,然后修改过之后的字符串上,把第一次匹配的oldstring2改成newstring2,同样的,这个不会在原文件filename中操作。

sed -i 's/oldstring1/newstring1/' filename,这个会把模式空间中匹配的第一个oldstring1改成newstring1,修改过之后的内容会输出到原文件filename中。

可以使用正则表达式的格式如下:

`sed ‘s/正则表达式/newstring/’ filename

`sed -r ‘s/拓展正则表达式/newstring/’ filename

sed ‘s/oldstring/newstring/’ filename

echo a:aa:aaa >> sedtest.txt
echo a:bb:aa >> sedtest.txt
echo cc : cc : ccc >> sedtest.txt

上边三条命令把下边的内容写到sedtest.txt:

a:aa:aaa
a:bb:aa
cc : cc : ccc

在这里插入图片描述

sed 's/a/aa/' sedtest.txt,可以看到每一个的第一个a被替换成了aa,再使用cat sedtest.txt可以看到sedtest.txt里边的内容没有任何改变。
在这里插入图片描述

echo 'go/d' >> sedtest.txtgo/d写入到sedtest.txt中,cat sedtest.txt可以看到sedtest.txt中的内容如下:

a:aa:aaa
a:bb:aa
cc : cc : ccc
go/d

若是想要把/改成o,而要使用sed 's///o/' sedtest.txt会报错

sed: -e expression #1, char 5: unknown option to \`s'

在这里插入图片描述

有两种方法,第一种使用转义字符sed 's/\//o/' sedtest.txtcat sedtest.txt可以看到sedtest.txt中的内容没有发生改变。
在这里插入图片描述

第二种是更改定界符,可以把定界符改为!sed 's!/!o!' sedtest.txtcat sedtest.txt可以看到sedtest.txt中的内容没有发生改变。
在这里插入图片描述

定界符也可以改为#@这些字符,sed 's#/#o#' sedtest.txtsed 's@/@o@' sedtest.txt
在这里插入图片描述

sed -e选项

echo '::' >> sedtest.txt::写入到sedtest.txt中,cat sedtest.txt可以看到内容如下:

a:aa:aaa
a:bb:aa
cc : cc : ccc
go/d
::

在这里插入图片描述

sed -e 's/aa/z:/' -e 's/::/oo:/' sedtest.txt | cat -n先把aa换成z:,然后在上一步已经替换的基础上再次把::替换成oo:,可以看到第1行中的aa已经被替换成了zoo,第2行中的aa只是被替换成z:,第5行中::改成了oo:|是管道符,就是把前边的输出当成后边命令的输入标志,cat -n把内容带上行号输出。cat sedtest.txt可以看到sedtest.txt中的内容没有发生改变。
在这里插入图片描述

sed 's/aa/z:/;s/::/oo:/' sedtest.txt | cat -n,把两个-e选项去掉,然后把命令之间使用;隔开也可以实现上边的效果。cat -n sedtest.txt可以看到sedtest.txt中的内容没有发生改变。
在这里插入图片描述

sed -i选项

sed -i 's/oldstring1/newstring1/' filename,这个会把模式空间中匹配的第一个oldstring1改成newstring1,然后把修改结果写到文件filename中。
cat -n sedtest.txt可以看到如下内容:

     1  a:aa:aaa
     2  a:bb:aa
     3  cc : cc : ccc
     4  go/d
     5  ::

前边的12345是行号,不是sedtest.txt里边的内容。
sed -i 's/\//o/' sedtest.txt会把/改成o,然后把更改过之后内容写入到sedtest.txtcat -n sedtest.txt可以看到更改之后的如下内容:

     1  a:aa:aaa
     2  a:bb:aa
     3  cc : cc : ccc
     4  good
     5  ::

发现文件中的/改成了o
在这里插入图片描述

sed正则支持

.匹配除换行符之外的任意一个字符,只能匹配一个字符。

sed 's/.:/love:/' sedtest.txt将第一组任意字符+:的字符串替换成love:cat -n sedtest.txt可以看到sedtest.txt中的内容没有发生改变。
在这里插入图片描述

*匹配它之前一个字符或者一个正则表达式0至若干次。

sed 's/c* /c/' sedtest.txt | cat -n,可以看到cc 被替换成了ccat -n sedtest.txt可以看到sedtest.txt中的内容没有发生改变。
在这里插入图片描述

^匹配一行的开始

echo ca:r >> sedtest.txtca:r写到文件sedtest.txt最后一行,cat -n sedtest.txt可以看到更改之后的如下内容:

     1  a:aa:aaa
     2  a:bb:aa
     3  cc : cc : ccc
     4  good
     5  ::
     6  ca:r

在这里插入图片描述

sed 's/a:/d:/' sedtest.txt | cat -n会把第六行中的a:改为d:,而sed 's/^a:/d:/' sedtest.txt | cat -n没有更改第六行中的a:
在这里插入图片描述

sed -r 拓展元字符

+匹配它前边字符一次或多次

echo 'a' >> sedfiletest.txt
echo 'aa' >> sedfiletest.txt
echo 'aaa' >> sedfiletest.txt
echo 'ab' >> sedfiletest.txt
echo 'aab' >> sedfiletest.txt
echo 'aaabbb' >> sedfiletest.txt

把下边的内容:

a
aa
aaa
ab
aab
aaabbb

写入到sedfiletest.txt里边。cat sedfiletest.txt看一下sedfiletest.txt里边内容。
在这里插入图片描述
sed -r 's/a+b/:/' sedfiletest.txt可以匹配abaabaaabaaa......b
在这里插入图片描述

echo 'b' >> sedfiletest.txt,把b写入到sedfiletest.txt里边。cat sedfiletest.txt看一下sedfiletest.txt里边内容。
在这里插入图片描述

sed -r 's/a?b/:/' sedfiletest.txt?只能匹配它前边的字符0次或者1次,不会匹配其他次数。
在这里插入图片描述

sed -r 's/a|b/:/' sedfiletest.txt | cat -n|相当于的意思,就是a或者b的意思,cat -n sedfiletest.txt发现文件里边的内容没有改变。
在这里插入图片描述

sed -r 's/(aa)|(b)/:/' sedfiletest.txt | cat -n()相当于组合的意思,就是aa或者b的意思,cat -n sedfiletest.txt发现文件里边的内容没有改变。
在这里插入图片描述
()还可以用于回调,就是可以当成一个变量暂时使用。sed -r 's/(aa)|(b)/\1:\2/g' sedfiletest.txt | cat -n这里的\1相当于aa\2相当于b
在这里插入图片描述

find / -name passwd

此文章为8月Day 7学习笔记,内容来源于极客时间《Linux 实战技能 100 讲》。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ Lambda表达式的完整介绍

一、Lambda表达式概述 c在c11标准中引入了lambda表达式,一般用于定义匿名函数,lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法。通常,lambda用于封装传递给算法或异步…

SpringBoot对接OpenAI

SpringBoot对接OpenAI 随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能。OpenAI作为一家领先的人工智能公司,提供了许多先进的自然语言处理和语言生成模型,其中包括深…

eclipse Java Code_Style Code_Templates

Preferences - Java - Code Style - Code Templates Eclipse [Java_Code_Style_Code_Templates_ZengWenFeng] 2023.08.07.xml 创建一个新的工程,不然有时候不生效,旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了

【雕爷学编程】Arduino动手做(195)---HT16k33 矩阵 8*8点阵屏模块5

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

Nginx(2)

目录 1.安装Nginx1.yum安装2.编译安装3.Nginx命令 2.配置文件详解 1.安装Nginx 1.yum安装 [rootdocker ~]# yum -y install nginx通过 rpm -ql nginx 查看安装信息 2.编译安装 2.1安装所需要的依赖 yum install -y gcc gcc-c make libtool wget pcre pcre-devel zlib zlib-…

4. C++构造函数和析构函数

一、对象的初始化和清理 C中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置,对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始状态,对其使用后果是未知的使用完一个对象或变量&#x…

CentOS7安装Maven详细教程

😊 作者: Eric 💖 主页: https://blog.csdn.net/weixin_47316183?typeblog 🎉 主题:CentOS7安装Maven详细教程 ⏱️ 创作时间: 2023年08月06日 第一步:上传或下载安装包&#x…

【Element】el-cascader 级联选择器

ElementUI label 为空的不展示 将children设为undefined dg(list) {list.forEach(item > {item.label item.nameitem.value item.iditem.children item.childrenList.length ! 0 ? item.childrenList : undefinedif (item.children) {this.dg(item.children)}}) },第…

拦截器对接口细粒度权限校验

文章目录 一、逻辑分析二、校验规则1.规则类型2.规则划分3.规则配置信息4.规则案例说明5.规则加载 三、拦截器定义1.自定义拦截器2.注册拦截器 四、获取请求参数1.获取get提交方式参数2.获取post提交方式参数(1)定义RequestWrapper类(2&#…

pinctrl_desc结构体注册

pinctrl_desc结构体注册 文章目录 pinctrl_desc结构体注册pinctrl_registerpinctrl_register_pins注册所有的引脚 pinctrl_register 构建好struct pinctrl_desc结构以后,会调用pinctrl_register函数注册一个pinctrl控制器,得到一个pinctrl_dev struct …

【大数据】Flink 详解(二):核心篇 Ⅰ

Flink 详解(二):核心篇 Ⅰ 14、Flink 的四大基石是什么? ​ Flink 的四大基石分别是: Checkpoint(检查点)State(状态)Time(时间)Window&#xff…

【机器学习2】什么是Jupyter notebook 新手使用Jupter notebook

什么是Jupyter notebook? Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享程序文档,支持实时代码&#x…

Redis 7.X Linux 环境安装

Redis 简介 作为一名开发人员,想必大家对Redis一定是耳熟能详,因此在此只做简单介绍。 Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value内存数据库,它提…

命令模式(C++)

定义 将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 应用场景 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比…

iPhone苹果手机地震预警功能怎么开启?

iPhone苹果手机地震预警功能怎么开启? 1、打开iPhone苹果手机设置; 2、在iPhone苹果手机设置内找到辅助功能; 3、在辅助功能内找到触控; 4、在iPhone苹果手机辅助功能触控内找到振动,如果是关闭状态请启; …

jdk1.7与jdk1.8中String.split()方法问题

split切割字符串的坑,会有索引越界的风险。 在jdk1.8中 public static void main(String[] args) { String card "abcdefgh"; System.out.println(card.split("").length); } 结果:8 在jdk1.7中,同样的代码 …

kubectl 详解(陈述式资源管理与声明式资源管理)

目录 一、kubectl简介 二、kubectl基础命令 三、基本信息查看 1.查看标签信息 ​2. 查看 master 节点状态 3. 查看命名空间 4.创建、删除命名空间app 5.在命名空间kube-public 创建副本控制器(deployment)来启动Pod(nginx-www&#xf…

网关 GateWay 的使用详解、路由、过滤器、跨域配置

一、网关的基本概念 SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是: 反向代理(请求的转发) 路由和负载均衡 身份认证和权限控制 对请求限流 1.2 相比于Zuul的优势: SpringCloudGateway基于Spring5中…

libcurl网络库的函数接口使用

文章目录 1、libcurl简介2、libcurl的使用3、函数简介4、 curl_easy_setopt函数部分选项介绍5、curl_easy_perform 函数说明(error 状态码)6、简单实例,包含库文件,头文件即可 1、libcurl简介 libcurl是一个跨平台的网络协议库,支…

【福建事业单位-推理判断】02图形推理(数量-空间重构)

【福建事业单位-推理判断】02图形推理(数量-空间重构) 一、数量规律1.1点(交点、切点)点的细化考法总结 1.2线条(线条的数量)线的细化考点一笔画(重点)一笔画的判定 总结 1.3 面面的…