sed 简易使用指南

sed 简易使用指南

    • 1 sed 介绍
    • 2 查找
    • 3 替换
    • 4 反向引用
    • 5 删除
    • 6 cai(菜)

在这里插入图片描述

导言:

笔者之前花了较多时间学习并整理了sed命令相关的内容,以及一些进阶内容。但是,到后来使用也就只记得那么几个简单的选项,再高级的方法有点记不住,所以感觉当时耗费的时间和精力有点得不偿失。这次笔者只整理一些日常运维中常用的选项和参数,遇到比较困难实现的时候可以考虑查阅资料或者用其他语言哦。

比较详细的资料,可以参考
SECTION 23 sed编辑器基础
SECTION 25 sed进阶(一)
SECTION 26 sed进阶(二)
【BASH】回顾与知识点梳理(八)

1 sed 介绍

sed编辑器称为流编辑器(stream editor),会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed编辑器根据命令来处理数据流中的数据,这些命令要么从命令行输入,要么存储在命令文本文件中

sed编辑器会执行下列操作:

1.一次从输入中读取一行数据
2.根据所提供的编辑器命令匹配数据
3.按照命令修改流中的数据
4.将新的数据输出到STDOUT

语法

SYNOPSISsed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed [options] {sed-commands} [input-file]...

  • 常用选项(OPTION)
选项说明
-n只输出匹配行
-i直接修改文件内容(谨慎使用)
-r支持扩展正则表达式
-e执行多条sed命令, 分号隔开
-f把所有脚本放到一个script文件里使用(不常用)
  • 常用命令(COMMAND)
命令说明
ssub,替换
pprint,输出,打印
ddel,删除
caic,replace 替换,c替换指定行,而s替换匹配内容
a,append 追加
i,insert,插入
  • 常用标记
标记说明
g表示行内全面替换
p表示打印行
\1第一个子串匹配标记,类似第二个\2,第三个\3
&已匹配字符串标记

我们提前准备一个文件用于示例展示

[root@node-252 ~]# cat -n sed.txt1  110.beijing.beijing2  210.liaoning.shenyang3  220.jilin.changchun4  230.heilongj.haerbin5  310.shanghai.shanghai6  320.jiangsu.nanjing7  330.zhejiang.hangzhou8  370.shandong.jinan

2 查找

基本格式

sed -n '***p' sed.txt

按行查找,第2行

[root@node-252 ~]# sed -n '2p' sed.txt
210.liaoning.shenyang

按行的范围查找,第2到5行

[root@node-252 ~]# sed -n '2,5p' sed.txt
210.liaoning.shenyang
220.jilin.changchun
230.heilongj.haerbin
310.shanghai.shanghai

按匹配模式查找

[root@node-252 ~]# sed -n '/heilongj/p' sed.txt
230.heilongj.haerbin

按匹配模式范围查找

[root@node-252 ~]# sed -n '/heilongj/,/jiangsu/p' sed.txt
230.heilongj.haerbin
310.shanghai.shanghai
320.jiangsu.nanjing

使用扩展正则表达式匹配多个记录,因为要使用扩展正字符|,则此时需要加-r

[root@node-252 ~]# sed -rn '/liaoning|jiangsu/p' sed.txt
210.liaoning.shenyang
320.jiangsu.nanjing

在标记位加I能够不区分大小写匹配

[root@node-252 ~]# sed -n '/JIANGSU/Ip' sed.txt
320.jiangsu.nanjing

3 替换

基本格式

sed  's/*/*/p' sed.txt

这里的/可以替换为#$等其他符号,但需要一致,这是因为当匹配内容中包含/的时候,为避免使用转义符提供便利

替换匹配内容

[root@node-252 ~]# sed  's/shenyang/dalian/g' sed.txt
110.beijing.beijing
210.liaoning.dalian		==>此处替换
220.jilin.changchun
230.heilongj.haerbin
310.shanghai.shanghai
320.jiangsu.nanjing
330.zhejiang.hangzhou
370.shandong.jinan

替换匹配内容,并仅显示替换的行

[root@node-252 ~]# sed -n 's/10/1000/gp' sed.txt
11000.beijing.beijing
21000.liaoning.shenyang
31000.shanghai.shanghai

替换匹配内容,并修改文件

[root@node-252 ~]# sed -i 's/shenyang/dalian/g' sed.txt
[root@node-252 ~]# cat -n sed.txt1  110.beijing.beijing2  210.liaoning.dalian3  220.jilin.changchun4  230.heilongj.haerbin5  310.shanghai.shanghai6  320.jiangsu.nanjing7  330.zhejiang.hangzhou8  370.shandong.jinan

这个应该是运维中sed用的最多的方式了,注意这个修改有一定危险程度,使用需谨慎

但是这个有个进阶的使用方式,如下

替换匹配内容,修改文件,并在修改前备份原文件

[root@node-252 ~]# sed -i.bak 's/dalian/shenyang/g' sed.txt
[root@node-252 ~]# cat sed.txt
110.beijing.beijing
210.liaoning.shenyang
220.jilin.changchun
230.heilongj.haerbin
310.shanghai.shanghai
320.jiangsu.nanjing
330.zhejiang.hangzhou
370.shandong.jinan
[root@node-252 ~]# cat sed.txt.bak
110.beijing.beijing
210.liaoning.dalian
220.jilin.changchun
230.heilongj.haerbin
310.shanghai.shanghai
320.jiangsu.nanjing
330.zhejiang.hangzhou
370.shandong.jinan

在替换文件内容之前会把原文件加后缀名.bak进行备份,当然如果您指定其他后缀名称也是可以的,.bak只是更为直观的体现该文件作用

替换还有一个隐藏功能是删除

[root@node-252 ~]# sed -n 's/dalian//gp' sed.txt.bak
210.liaoning.

4 反向引用

它允许你捕获一部分表达式,然后在同一个模式空间中的其他地方重复使用这部分表达式。反向引用的语法是:\1, \2, \3, ..., \9,对应到前面的相应的捕获组(capture group)。

由于反向引用需要使用(),所以此时我们需要使用选项-r

#210.liaoning.shenyang	匹配行
[root@node-252 ~]# sed -rn 's#(.*).liaoning.(.*)#\1,\2#gp' sed.txt
210,shenyang

使用&可以表示前面所有的匹配内容

[root@node-252 ~]# echo '123456'| sed -r 's#(.*)#++++&++++#g'
++++123456++++

示例
反向引用可以干什么?举个简单的例子,要求把/etc/passwd中的用户名和命令解释器进行调换,即

[root@node-252 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
#改为
/bin/bash:x:0:0:root:/root:root

怎么做呢?

[root@node-252 ~]# sed -r 's#(.*)(:x.*:)(.*)#\3\2\1#g' /etc/passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
...

这里子串\2之所以能匹配成功,也是利用了正则表达式的贪婪性

5 删除

这部分和查找的使用方式基本类似,可能最大的区别是p换成了d

[root@node-252 ~]# cat -n sed.txt1  110.beijing.beijing2  210.liaoning.shenyang3  220.jilin.changchun4  230.heilongj.haerbin5  310.shanghai.shanghai6  320.jiangsu.nanjing7  330.zhejiang.hangzhou8  370.shandong.jinan

删除指定行

[root@node-252 ~]# sed '3d' sed.txt
110.beijing.beijing
210.liaoning.shenyang
230.heilongj.haerbin
310.shanghai.shanghai
320.jiangsu.nanjing
330.zhejiang.hangzhou
370.shandong.jinan

删除指定范围行

[root@node-252 ~]# sed '3,5d' sed.txt
110.beijing.beijing
210.liaoning.shenyang
320.jiangsu.nanjing
330.zhejiang.hangzhou
370.shandong.jinan

删除匹配行

[root@node-252 ~]# sed -r '/heilongj/d' sed.txt
110.beijing.beijing
210.liaoning.shenyang
220.jilin.changchun
310.shanghai.shanghai
320.jiangsu.nanjing
330.zhejiang.hangzhou
370.shandong.jinan

删除匹配范围行

[root@node-252 ~]# sed -r '/heilongj/,/jiangsu/d' sed.txt
110.beijing.beijing
210.liaoning.shenyang
220.jilin.changchun
330.zhejiang.hangzhou
370.shandong.jinan

6 cai(菜)

由于cai使用方法基本类似,都是针对行进行操作,所以放在一起说明了

  • c replace,替换匹配行整行
  • a append,在匹配行后追加
  • i insert,在匹配行前增加

基本格式

sed '[address]command\newline' [file]

反斜线\可以换成空格' '

[root@node-252 ~]# cat -n sed.txt1  110.beijing.beijing2  210.liaoning.shenyang3  220.jilin.changchun4  230.heilongj.haerbin5  310.shanghai.shanghai6  320.jiangsu.nanjing7  330.zhejiang.hangzhou8  370.shandong.jinan
[root@node-252 ~]# sed '4c abcdefg' sed.txt|cat -n1  110.beijing.beijing2  210.liaoning.shenyang3  220.jilin.changchun4  abcdefg5  310.shanghai.shanghai6  320.jiangsu.nanjing7  330.zhejiang.hangzhou8  370.shandong.jinan
[root@node-252 ~]# sed '4a abcdefg' sed.txt|cat -n1  110.beijing.beijing2  210.liaoning.shenyang3  220.jilin.changchun4  230.heilongj.haerbin5  abcdefg6  310.shanghai.shanghai7  320.jiangsu.nanjing8  330.zhejiang.hangzhou9  370.shandong.jinan
[root@node-252 ~]# sed '4i abcdefg' sed.txt|cat -n1  110.beijing.beijing2  210.liaoning.shenyang3  220.jilin.changchun4  abcdefg5  230.heilongj.haerbin6  310.shanghai.shanghai7  320.jiangsu.nanjing8  330.zhejiang.hangzhou9  370.shandong.jinan

匹配模式

[root@node-252 ~]# sed '/heilongj/i abcdefg' sed.txt|cat -n1  110.beijing.beijing2  210.liaoning.shenyang3  220.jilin.changchun4  abcdefg5  230.heilongj.haerbin6  310.shanghai.shanghai7  320.jiangsu.nanjing8  330.zhejiang.hangzhou9  370.shandong.jinan

范围匹配

[root@node-252 ~]# sed '/heilongj/,/jiangsu/i abcdefg' sed.txt|cat -n1  110.beijing.beijing2  210.liaoning.shenyang3  220.jilin.changchun4  abcdefg5  230.heilongj.haerbin6  abcdefg7  310.shanghai.shanghai8  abcdefg9  320.jiangsu.nanjing10  330.zhejiang.hangzhou11  370.shandong.jinan

注意:每行前面都会插入字符串,这并不常用

最后我们以一个小练习结束本文,分别使用grepsedawk分别过滤出本机IP地址

[root@node-252 ~]# ip a s ens33|grep -E -o 'inet (.*)/'|grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}'
192.168.202.128[root@node-252 ~]# ip a s ens33|sed -n '3p'|sed -r 's#^.*inet (.*)/.*$#\1#g'
192.168.202.128[root@node-252 ~]# ip a s ens33|awk 'NR==3 {print $2}'|awk -F/ '{print $1}'
192.168.202.128

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6-8 残差网络(ResNet)

随着我们设计越来越深的网络,深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力,在这种网络中,添加层会使网络更具表现力, 为了取得质的突破,我们需要一些数学基础知识。 残差网络…

【虚拟化】KVM使用virt-manager部署及管理虚拟机

目录 一、KVM 概述 二、KVM工作原理 三、部署KVM 四、新建虚拟机步骤 4.1 创建存储池并创建存储卷 4.1.1 创建存储池 4.1.2 创建存储卷 4.3 创建ISO存储池 4.4 生成新的虚拟机 一、KVM 概述 KVM 是 Kernel-based Virtual Machine 的缩写,是一种用于虚拟化的…

大模型微调深入研究

在本博文系列的前一部分中,我们探讨了情境学习的概念,这是一种克服大型语言模型 (LLM) 的“舒适区”限制的强大方法。我们讨论了如何使用这些技术来转换任务并将其移回模型的专业领域,从而提高性能并与有用性、诚实性和无害性的关键设计原则保…

WebBench源码分析

WebBench 源码解析 一、前言 WebBench 作为一款网站性能测试工具,其源码蕴含着丰富的技术细节和逻辑流程。本文将深入剖析其安装编译过程以及关键函数的核心逻辑。 二、安装编译 1. 克隆代码到本地仓库 git clone https://github.com/EZLippi/WebBench.git2. 编…

使用 Squid 搭建 Http 代理服务器隐藏 IP

在一些情况下,需要变更自己的访问 IP,可以通过 Squid 搭建代理服务器实现。 本文使用的是 CentOS 7.6 系统。 一、部署 Squid 安装 Squid。 yum install squid -y启动服 systemctl start squid二、访问控制 总有刁民想害郑,疯狂访问朕的…

基于宝塔面板稳定快速安装 ssl 证书脚本

背景 我通过AI制作了不少关于签发ssl证书的脚本,目的是方便无脑安装,不需要懂代码。 但全都是基于acme.sh这个工具来设计的脚本,而且证书申请有点慢,有时还会申请失败。 然后我发现了certbot, 安装证书可谓神速! c…

ASP.NET Core基础 - 简介

目录 一. 简介 A、跨平台性 B、高性能 C、开源性 D、模块化与可扩展性 E、集成现代前端技术 二. ASP.NET 4.x 和 ASP.NET Core 比较 A、架构与平台支持 B、性能 C、开发体验 D、社区支持与生态系统 三. NET 与 .NET Framework 比较 A、概念范围 B、跨平台能力 C…

基于JAVA的高考智能排考场系统设计与实现,源码、部署+讲解

绪 论 随着教育规模的不断扩大和技术的进步,传统的考试管理方式面临着诸多挑战,如考试安排的复杂性、作弊现象的频发以及考试过程中的监督和管理等问题。因此,针对这些挑战,智能排考系统应运而生。 智能排考系统利用先进的技术…

数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)

文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出,对于需要动态维护的散列表冲突是不可避免的,无论你的散列函数设计的有多么精妙,因此我们不得不回答的第二个重要问题就是一旦发生冲突&…

零售EDI:OBI欧倍德EDI项目案例

OBI欧倍德公司是德国建材和家居装饰零售连锁店,在德国以及其他欧洲国家拥有众多分店,是欧洲领先的DIY(Do It Yourself)零售商之一。为了更好地处理与全球供应商之间的业务数据往来,OBI采用EDI提高其供应链的自动化水平…

基于微信小程序的宠物服务平台(系统源码+lw+部署文档+讲解等)

文章目录 目录 详细视频演示 系统详细设计截图 微信小程序系统的实现 1.1系统前台功能的实现 2.1微信小程序开发环境搭建 2.2微信开发者工具 2.3程序应用相关技术和知识 2.3.1小程序目录结构以及框架介绍 2.3.2 Java技术 2.3.3 MySQL数据库 2.3.4 SSM框架 源码获…

Pygame制作简单的跑酷游戏

今天我们来看看如何使用Pygame框架制作一个简单的跑酷游戏。这个游戏包含了基本的游戏元素,如玩家角色、障碍物、背景、音效等,可以作为入门Pygame游戏开发的一个不错的示例。 游戏概述 这是一个简单的横版跑酷游戏,玩家控制一个忍者角色,通过跳跃来躲避迎面而来的各种障碍物…

【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信

文章目录 前言 背景介绍 SCI通信 Transmitter Receiver SCI中断 分析和应用 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 背景介绍 近期使用TI C2000 DSP做的一个嵌入式系统开发项目中,在使用它的SCI&…

Pytorch系列-张量的类型转换

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 张量转换为NumPy数组 使用Tensor.numpy()函数可以将张量转换为ndarray数组 # 1.将张量转换为numpy数组 data_tensortorch.tensor([2,3,4]) # 使用张量对象中的numpy函数进行转…

c++STL中list介绍,模拟实现和list与vector对比

目录 前言 : 1. list的介绍及使用 1.1list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 2. list的模拟实现 3. list与vector的对…

串行并行数据转换

前言 串行数据传输通常在数据传输距离较远时使用,而并行数据传输适用于短距离、高速数据交换。通过转换,可以根据实际需求选择合适的传输方式,以优化数据传输效率和速度。串行数据传输在长距离传输中可以减少信号的干扰和失真,因为…

springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice

一、 背景 因为项目中需要使用word转pdf功能,因为转换速度原因,最后选用了libreoffice,原因及部署请参考 linux ubuntu环境安装libreoffice,word转pdf 远程调用的话可选docker部署,请看2.3.1 二、springboot整合libr…

达梦数据库的系统视图v$mem_pool

达梦数据库的系统视图v$mem_pool 达梦数据库的V$MEM_POOL视图主要用于显示所有内存池的信息。通过查询这个视图,用户可以监控数据库中各个内存组件的使用状况,包括内存池的大小、使用情况等。这有助于用户判断内存池是否空闲或紧张,从而进行…

【机器人学】6-4.六自由度机器人运动学参数辨识-机器人精度验证【附MATLAB代码】

前言 前两个章节以及完成了机器人参数辨识。 【机器人学】6-1.六自由度机器人运动学参数辨识-辨识数学模型的建立 【机器人学】6-2.六自由度机器人运动学参数辨识-优化方法求解辨识参数 标定了工具端、基座以及机器人本身的DH参数。那么我们的机器人精度如何呢?机…

Unity射击游戏开发教程:(31)制造一定追踪行为的敌人

在本文中,我们将介绍如何在两种敌人行为之间切换。本文是前两篇文章的延续,分别介绍了敌人躲避玩家射击以及敌人不断旋转并向玩家射击的情况。我只是介绍如何在这两种行为之间进行转换。 这种新的敌人行为的目标: 当不开火时,敌人可以躲避玩家的射击。射击时,敌人无法躲避…