sed 简易使用指南

news2024/11/13 11:16:35

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

语法

SYNOPSIS
       sed [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.txt
     1  110.beijing.beijing
     2  210.liaoning.shenyang
     3  220.jilin.changchun
     4  230.heilongj.haerbin
     5  310.shanghai.shanghai
     6  320.jiangsu.nanjing
     7  330.zhejiang.hangzhou
     8  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.txt
     1  110.beijing.beijing
     2  210.liaoning.dalian
     3  220.jilin.changchun
     4  230.heilongj.haerbin
     5  310.shanghai.shanghai
     6  320.jiangsu.nanjing
     7  330.zhejiang.hangzhou
     8  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.txt
     1  110.beijing.beijing
     2  210.liaoning.shenyang
     3  220.jilin.changchun
     4  230.heilongj.haerbin
     5  310.shanghai.shanghai
     6  320.jiangsu.nanjing
     7  330.zhejiang.hangzhou
     8  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.txt
     1  110.beijing.beijing
     2  210.liaoning.shenyang
     3  220.jilin.changchun
     4  230.heilongj.haerbin
     5  310.shanghai.shanghai
     6  320.jiangsu.nanjing
     7  330.zhejiang.hangzhou
     8  370.shandong.jinan
[root@node-252 ~]# sed '4c abcdefg' sed.txt|cat -n
     1  110.beijing.beijing
     2  210.liaoning.shenyang
     3  220.jilin.changchun
     4  abcdefg
     5  310.shanghai.shanghai
     6  320.jiangsu.nanjing
     7  330.zhejiang.hangzhou
     8  370.shandong.jinan
[root@node-252 ~]# sed '4a abcdefg' sed.txt|cat -n
     1  110.beijing.beijing
     2  210.liaoning.shenyang
     3  220.jilin.changchun
     4  230.heilongj.haerbin
     5  abcdefg
     6  310.shanghai.shanghai
     7  320.jiangsu.nanjing
     8  330.zhejiang.hangzhou
     9  370.shandong.jinan
[root@node-252 ~]# sed '4i abcdefg' sed.txt|cat -n
     1  110.beijing.beijing
     2  210.liaoning.shenyang
     3  220.jilin.changchun
     4  abcdefg
     5  230.heilongj.haerbin
     6  310.shanghai.shanghai
     7  320.jiangsu.nanjing
     8  330.zhejiang.hangzhou
     9  370.shandong.jinan

匹配模式

[root@node-252 ~]# sed '/heilongj/i abcdefg' sed.txt|cat -n
     1  110.beijing.beijing
     2  210.liaoning.shenyang
     3  220.jilin.changchun
     4  abcdefg
     5  230.heilongj.haerbin
     6  310.shanghai.shanghai
     7  320.jiangsu.nanjing
     8  330.zhejiang.hangzhou
     9  370.shandong.jinan

范围匹配

[root@node-252 ~]# sed '/heilongj/,/jiangsu/i abcdefg' sed.txt|cat -n
     1  110.beijing.beijing
     2  210.liaoning.shenyang
     3  220.jilin.changchun
     4  abcdefg
     5  230.heilongj.haerbin
     6  abcdefg
     7  310.shanghai.shanghai
     8  abcdefg
     9  320.jiangsu.nanjing
    10  330.zhejiang.hangzhou
    11  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.coloradmin.cn/o/1984928.html

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

相关文章

程序员进阶之路:缓存、网络、内存与案例

编辑推荐 适读人群 :本书适合有一定开发经验的开发人员,想要突破初级层次,迈向高级开发的程序员阅读。 【与时俱进】本书基于Linux 6.0及以上版本讲解书中涉及的各个模块,有助于读者理解现代Linux内核,掌握实用的技术…

XML动态sql查询当前时间之前的信息报错

如图&#xff0c;sql语句在数据库里可以正常运行但是再XML文件不可以正常运行&#xff0c;报错。 原因&#xff1a;在XML中小于号"<"是会被默认认定成文一个标签的开始&#xff0c;所以用小于号就会报错。 解决办法&#xff1a; 1.把表达式反过来改成大于号 2…

新手教学系列——使用 Redis 实现任务队列:先进先出和后进先出的选择

在分布式系统和高并发场景下,任务队列是管理任务调度和执行的关键工具。Redis 作为一种高效的内存数据库,提供了简单且强大的数据结构,可以方便地实现任务队列。本文将深入探讨如何利用 Redis 实现先进先出(FIFO)和后进先出(LIFO)两种任务队列,并介绍其应用场景和实现方…

11153 kill boss

这个问题可以通过模拟游戏的过程来解决。我们可以遍历每一轮的出招&#xff0c;根据出招的规则来计算每一轮的伤害&#xff0c;并更新Acmer和Boss的血量。如果在某一轮结束后&#xff0c;Acmer的血量小于等于0&#xff0c;那么Boss赢&#xff1b;如果Boss的血量小于等于0&#…

总线学习3--SPI

一 环境搭建 老规矩&#xff0c;先上图吧。。 上面电源线接到VBUS了&#xff0c;给的一个5V&#xff0c;应该3.3V。不过这个屏还能正常跑也是不错。 折腾了一个晚上&#xff0c;主要还是找驱动&#xff0c;然后熟悉SPI接口的接法。 遇到了两个坑&#xff1a; 1 接口名称不统…

Python异常处理:12个异常处理技巧,你掌握了几个?

探索Python异常处理的深度策略&#xff0c;从基础的try-except结构到自定义异常类的创建&#xff0c;再到利用上下文管理器和装饰器提升代码健壮性。深入理解异常传递机制&#xff0c;掌握日志记录与并发环境下异常处理的关键实践&#xff0c;强调了性能考量与避免异常作为控制…

简单的docker学习 第3章 docker镜像

第3章 Docker 镜像 3.1镜像基础 3.1.1 镜像简介 ​ 镜像是一种轻量级、可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容&#xff0c;包括代码、库、环境变量和配置文件等…

尚硅谷谷粒商城项目笔记——三、安装docker【电脑CPU:AMD】

三、安装docker 注意&#xff1a; 因为电脑是AMD芯片&#xff0c;自己知识储备不够&#xff0c;无法保证和课程中用到的环境一样&#xff0c;所以环境都是自己根据适应硬件软件环境重新配置的&#xff0c;这里的虚拟机使用的是VMware。 首先关闭防火墙和安全策略 systemctl…

nature子刊真实案例,录用仅需1个月!1区SCI,截稿在即!

关注GZH【欧亚科睿学术】&#xff0c;第一时间了解期刊最新动态&#xff01; &#x1f680; &#x1f680; &#x1f680; &#x1f680; 快到飞起&#xff01;这本毕业神刊竟1个月秒录&#xff01; SCI期刊信息简介 【期刊类型】工程综合类SCIE&#xff08;1个月17天…

mac chrome打开网页,莫名其妙的闪退

今天&#xff0c;突然有用户反馈更新到浏览器版本后&#xff0c;打开特定网页时&#xff0c;浏览器会出现闪退的情况。 经过对业务代码长时间的排查都没有发现具体的问题&#xff0c;于是想到使用“大数据排查”&#xff08;上网google下&#xff09;的方法&#xff0c;终于在茫…

【技巧】IDEA打断点增加条件控制

【技巧】IDEA打断点增加条件控制

03、DQL(数据查询语言)

目录 1、编写顺序 2、基本查询 3、条件查询 4、聚合函数 5、分组查询 6、排序查询 7、分页查询 8、执行顺序 1、编写顺序 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数2、基本查…

Visual C++ 下载、安装教程(微软常用运行库合集|dll报错必装)

前言 Microsoft Visual C Redistributable&#xff08;简称MSVC&#xff0c;VB/VC&#xff0c;系统运行库&#xff09;是Windows操作系统应用程序的基础类型库组件。此版Visual C运行库组件合集&#xff08;微软常用运行库合集&#xff09;由国内封装爱好者Dreamcast打包而成&…

C#学习笔记14:SYN6288语音模块_Winform上位机控制软件

今日尝试使用C# Winform写一个上位机软件控制 SYN6288语音模块 这里不讲什么基本原理(或者讲的比较略简)&#xff0c;直接讲实现了就...... 文章提供测试代码讲解、测试效果图、整体测试工程下载 目录 控件的摆放&#xff1a; SYN6288介绍: 代码编程&#xff1a; 对16进制发送…

计算机毕业设计选题推荐-出租车服务管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

ArrayList顺序表

目录 一、ArrayList变量的创建 二、ArrayList的三种构造方法 2.1 ArrayList() 2.2 ArrayList(int) 2.3 ArrayList(Collection) 三、ArrayList常用方法介绍 3.1 boolean add(E e) 3.2 E remove(int index) 和 boolean remove(Object o) 3.3 List subList(int fromInde…

hive udtf 函数:输入一个字符串,将这个字符串按照特殊的逻辑处理之后,输出4个字段

这里要继承GenericUDTF 这个抽象类,直接上代码: package com.xxx.hive.udf; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hi…

2024年最建议买哪几款蓝牙耳机?四大2024性价比王牌机型推荐

随着科技的飞速发展&#xff0c;蓝牙耳机已经从昔日的奢侈品转变为如今生活中的必需品。面对日益丰富的产品线和不断更新的技术特性&#xff0c;选择一款适合自己的蓝牙耳机变得越来越具有挑战性&#xff0c;那么在2024年最建议买哪几款蓝牙耳机&#xff1f;作为蓝牙耳机爱好者…

48天笔试训练错题——day42

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 走迷宫 选择题 1. 动态分配&#xff1a;使用 DHCP 协议动态分配 IP。 IP 地址不但有单播地址&#xff0c;多播地址&#xff0c;还有广播地址。 如果一个主机有块个网卡&#xff0c;那么每块网卡都可以拥…

人工智能时代,程序员如何保持核心竞争力,不会一觉醒来,被自己写的代码淘汰了 ≧ ﹏ ≦

随着AIGC&#xff08;人工智能生成内容&#xff09;技术的飞速发展&#xff0c;尤其是像ChatGPT、Midjourney、Claude等大语言模型的崛起&#xff0c;人工智能正以前所未有的速度渗透到编程领域&#xff0c;彻底改变了程序员的工作方式。这一变革既带来了挑战&#xff0c;也孕育…