Shell脚本攻略:文本三剑客之sed

2023-11-06

目录

一、理论

1.sed

二、实验

1.sed命令的寻址打印

2.显示奇偶

 3.查找替换

4.后向引用

5.截取版本号

 6.替换IP地址


一、理论

1.sed

(1) 概念

sed 英文全称为stream editor流式编辑器,sed 对输入流(文件或来自管道的输入)执行基本文本转换单通过流,所以效率很高。 但是, sed 能够管道过滤文本,特别区别于其他类型的编辑器。

sed 可以在命令行或 shel l脚本中使用,以非交互方式编辑文件。 也许最有用的功能是对一个字符串进行 “搜索和替换” 到另一个字符串。

sed最为核心的功能是增删改查。

(2)sed语法格式和工作流程

语法格式:

sed 选项 ’定位 操作符’ 文件路径

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

# 注:
sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才不是0

工作流程:

sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在
临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完
成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有
改变,除非你使用重定向存储输出,或者使用sed -i选项
-i选项就是将本该输出到屏幕上的内容输出/流入文件中

(3)sed命令的常用选项

表1 sed命令的常用选项

选项 功能
-e 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f  表示用指定的脚本文件来处理输入的文本文件
-h  显示帮助
-i 直接修改目标文本文件 慎用
-i.bak 修改文件时会创建备份文件,防止手误
-n 仅显示script处理后的结果

(4)sed命令的操作符 

表2 sed命令的操作符 

操作符 功能
s/// 替换,替换指定字符。
d 删除,删除选定的行。
a append增加,在当前行下面增加一行指定内容。
i insert插入,在选定行上面插入一行指定内容。
c 替换,将选定行清除后替换为c后面指定内容。
y 字符转换,转换前后的字符长度必须相同。
p 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,
则以 ASCII 码输出。其通常与“-n”选项一起使用。
= 打印行号。
l(小写L) 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
r 扩展正则表达式

        ①查操作

          根据内容筛选文件信息
          根据行号筛查文件信息

       ② 删除指定内容

表3 删操作

编辑命令 含义
1d 删除第1行的内容
1,5d 删除1行到5行的内容
2,+5d 删除第2行以及往下的5行的内容
5,$d 删除5到最后一行行
4,6!d 除了4-6行,其他的全部删除
/pattern1/d 删除每行中匹配到pattern1的行内容
/pattern1/,/pattern2/d 删除匹配到pattern1的行直到匹配到pattern2的所有行内容
/pattern1/,/pattern2/!d 除了pattern1-pattern2的行,其余的全部删除,反向删除
/pattern1/,10d 删除匹配到pattern1的行到10行的所有行内容
/pattern1/!d 除了pattern1的行,其余的全部删除,反向删除
 
10,/pattern1/d 删除第10行直到匹配到pattern1的所有内容
/^$/d 通过^$,来删除空行

         ③ 修改文件信息

             格式:
             行范围 s/旧字符串/新字符串/替换标记  ​

表4 改操作

命令 含义
1s/old/new/ 替换第1行内容old为new
1,10s/old/new/ 替换1行到10行的内容old为new
1,+5s/old/new/ 替换1行到6行的内容old为new
/pattern1/s/old/new/ 替换匹配pattern1的内容old为new
/pattern1/,/pattern2/s/old/new/ 替换匹配到pattern1的行直到
匹配到pattern2的所有行内容old为new
/pattern1/,/pattern2/s/old/new/ 替换匹配到pattern1的行直到
匹配到pattern2的所有行内容old为new

                   字母字符进行大小写的替换:

                   1)  将大写全部转换为小写:

                     sed 's/[A-Z]/\l&/g' test1.txt

                   2)把首字母替换成大写

                     sed 's/[a-z]/\u&/' test1.txt

                   3)将小写全部转换为大写(末尾加上了一个g)

                     sed 's/[a-z]/\U&/g' test1.txt

                    替换指定内容

                  后向引用

                 ( )内的按顺序标为123 ,引用时\1调用第一个()的内容,\n表示调用第n个()的内容。

                .*表示任意长度字符不管是什么字符

                 's///'查找替换标准格式。

         ④  增加内容

表4 增加操作

命令 含义
a 行后追加内容 append
i 行前追加内容 insert
r 读入外部文件,行后追加
w 将匹配行写入外部文件

            在当前行下面增加一行指定内容

(5)sed命令的打印功能

       ①查看文件内容

    ② 支持重定向输入

        sed '' < /etc/fstab

    ③ 支持管道符

        cat /etc/passwd |sed ''

    ④ 默认打印方式

       1)  sed有一个默认输出,加上P,会打印两行:

               sed -e 'p' test.txt

       2)-n禁止了默认输出,就只有一行:

               sed -n 'p' test.txt 

(6)sed命令的寻址打印

  方式一:按照行号寻求内容

表3 按照行号寻求内容

命令 功能
sed -n '1p' test.txt 打印第一行
sed -n '4p' test.txt 打印第四行
sed -n '$p' test.txt 打印最后一行

  方式二:进行行号范围区间的打印

表4 进行行号范围区间的打印

命令 功能
sed -n '1,3p' test.txt 打印1-3行
sed -n '5,$p' test.txt 打印第五行到最后一行
sed -n '2,+2p' test.txt 打印第二行+两行的内容,相当于2,4p
sed -n '3p;5p' test.txt 输出第三行和第五行

  方式三:指定间隔打印

表5 指定间隔打印

命令 功能
sed -n -e '2p' -e'$p' test.txt 打印第二行和最后一行
sed -n -e '2p' -e'3p' test.txt 打印第二行和第三行

  方式四:对奇数行和偶数行的打印

n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行:

表6 对奇数行和偶数行的打印

命令 功能
sed -n 'n;p' test.txt 打印偶数的行
sed -n 'p;n' test.txt  打印奇数的行

(7)文本模式过滤行内容

方式一:对包含的字符串进行过滤打印

表7 对包含的字符串进行过滤打印

命令 功能
sed -n '/o/p' test.txt 包含o的所有行
sed -n '/th/p' test.txt 包含th的所有行

方式二:应用基础正则表达式进行打印

表8 应用基础正则表达式进行打印

命令 功能
sed -n  '/^root/p' /etc/passwd 以root为开头的所有内容,全文本搜索
sed -n  '/bash$/p' /etc/passwd 以bash结尾的所有内容,全文本搜索
sed -n  '4,/bash$/p' /etc/passwd 从第四行开始,一直打印到第一个以bash为结尾的所在行

方式三:使用扩展正则表达式进行打印

注意: 
sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 。

表9 使用扩展正则表达式进行打印

命令 功能
sed -r -n  '/(99:){2,}/p' /etc/passwd 包含有两个99:的内容所在行
sed -r -n  '/^root|bash$/p' /etc/passwd  包换以root开头,或者以bsah结尾的内容所在行

(8)sed的查找替换使用

格式:sed '/可使用正则表达式选择范围/'s/查找内容/替换内容/g g表示全文,固定格式的///可以用###等符号替换

注意:查找内容可使用正则表达式,替换内容不可使用正则表达式

二、实验

1.sed命令的寻址打印

(1)查看文件

(2) 显示默认输出(输出2遍)

sed有一个默认输出,加上P,会打印两行。

    (3) 不显示默认输出

            -n禁止了默认输出,就只有一行

       (4) 打印第二行

       (5) 打印最后一行

       (6) 只显示行号

      (7)  显示行号和每行的内容

          ;表示和    

 (8)  显示1到3行  

           ,表示到

 (9)  显示区间

 

(10)  分开显示

(11)  显示第2-4行

2.显示奇偶

(1)显示奇数(每间隔1个打印一次)

   ~ 步进,1~2,1个间隔

(2)显示偶数(每间隔2个打印一次)

   ~ 步进,0~2,2个间隔

(3)显示奇数行

先跳行next ;输出行

(4)显示偶数行

先输出首行;下一行跳

 3.查找替换

(1)以root为开头的所有内容,全文本搜索

(2)以bash结尾的所有内容,全文本搜索

(3)从第30行开始,一直打印到第一个以bash为结尾的所在行

(4)使用扩展正则表达式进行打印

 包含有两个99:的内容所在行

 包换以root开头,或者以bsah结尾的内容所在行

4.后向引用

(1)取IP地址

(2)反向输出

(3)批量修改扩展名

① 将1行多列内容显示为多行1列

② 将文件后缀名.txt批量 修改为.jpg

③ 批量生成用户

 ④ 备份文件

备份

cp /etc/yum.repos.d/CentOS-Base.repo{,.bak}

还原

 cp /etc/yum.repos.d/CentOS-Base.repo{.bak,}

5.截取版本号(笔试题)

(1)截取每行版本号

(2)脚本截图

 6.替换IP地址

(1)替换IP地址

(2)替换网关

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell脚本攻略:文本三剑客之sed 的相关文章

随机推荐

  • 华为OD机试 -计算日期到天数转换(C++ & Java & JS & Python)

    描述 根据输入的日期 计算是这一年的第几天 保证年份为4位数且日期合法 进阶 时间复杂度 O n 空间复杂度 1 O 1 输入描述 输入一行 每行空格分割 分别是年 月 日 输出描述 输出是这一年的第几天 示例1 输入 2012 12 31
  • 基于VUE的可隐藏的顶部菜单栏组件

    效果图
  • 给我flink on k8s的执行命令案例

    在K8s上运行Flink的执行命令案例如下 1 下载Flink并将其解压到您的工作目录 wget https archive apache org dist flink flink 1 10 2 flink 1 10 2 bin scala
  • 【语义分割】10、ISNet: Integrate Image-Level and Semantic-Level Context for Semantic Segmentation

    出处 ICCV2021 文章目录 一 背景 二 动机 三 方法 3 1 整体过程 3 2 Image Level Context Module 3 3 Semantic Level Context Module 3 4 Loss Funct
  • h5学习笔记:flex space-between 实现左右对齐布局

    今天在尝试拼小程序界面的时候一直想换种口味 于是想使用flex布局 小程序支持flex也比较好 今天遇到一个问题就是要实现一个一左 一右 方式布局 之前习惯了用绝对布局的方式 可以将右边的元素实现right 0 处理 细心想了一既然使用fl
  • netdata监控服务器主机(包括Docker容器)

    效果 Docker部署 创建挂载目录 mkdir p data netdata netdatacache netdatalib docker运行 docker run d name netdata p 19999 19999 v data
  • 四个问题,判断自己是否适合学习编程

    下面有四个问题 可以测一测你是否适合学习编程 你的逻辑和抽象思维能力比较强吗 你愿意花费很多业余时间去学习新的东西吗 你对研究和探索未知领域保持足够的好奇心吗 遇到问题和困难的时候你有足够的耐心和毅力去解决吗 如果上面这四个问题中有三个及以
  • Unity导入模型一面有贴图另一面透明的解决方案

    出现这种情况是因为模型用了双面材质 而Unity不支持双面材质 故导入模型到Unity中 会出现一面有贴图 另一面透明的情况 解决方法 1 自定义一个双面材质Shader 代码如下 Shader Nature Vegitation Vert
  • 手把手教你添加多个IP地址

    IP地址 IP地址是指互联网协议地址 又译为网际协议地址 是IP协议提供的一种统一的地址格式 它为互联网上的每一个网络和每一台主机分配一个逻辑地址 以此来屏蔽物理地址的差异 子网掩码 子网掩码又叫网络掩码 地址掩码 子网络遮罩 它用来指明一
  • Linux如何查看JDK的安装路径

    which java 首先要申明一下which java是定位不到安装路径的 which java定位到的是java程序的执行路径 root localhost which java usr bin java root localhost
  • sqli-labs-master第21关、22关

    前言 昨天我们研究了http头部cookie注入 反正我是让让抓包软件给搞死了 废了老半天劲 我们来研究下加密后的cookie 第21关 看到这个页面我们还是输入用户密码 返回了这个页面 提示了一系列的信息 我们还是抓包分析下 看到了加密后
  • 【RocketMQ】设计理念与核心概念扫盲

    RocketMQ 设计理念与核心概念扫盲 文章目录 RocketMQ 设计理念与核心概念扫盲 一 RocketMQ的设计理念和目标 1 1 设计理念 1 2 设计目标 二 RocketMQ的核心概念扫盲篇 2 1 部署架构 2 1 1 Na
  • 公司规定所有接口都用 POST请求?

    最近在逛知乎的时候发现一个有趣的问题 公司规定所有接口都用 post 请求 这是为什么 看到这个问题的时候其实我也挺有感触的 因为我也曾经这样问过我自己 在19的时候接到一个项目是从零开始搭建一个微服务 当时就有了解过接口的一些规范 比如耳
  • Myeclipse8.x集成Aptana

    MyEclipse8 x集成Aptana 2011 01 02 14 25 47 分类 Java 举报 字号 订阅 前几天在网上找了很多关于MyEclipse集成Aptana插件 找到的只有MyEclipse6 0的版本 而且都是同一篇文章
  • SpringBoot系列教程JPA之update使用姿势

    通过本篇博文 您至少可以选到 save 直接根据id来修改记录 利用jpl 实现查询修改的使用姿势 初识事物的神秘面纱 I 环境准备 在开始之前 当然得先准备好基础环境 如安装测试使用mysql 创建SpringBoot项目工程 设置好配置
  • 【源码篇】基于ssm+vue+微信小程序的医疗科普小程序

    系统介绍 这是一个ssm vue 微信小程序的医疗科普小程序 分为pc端和微信小程序端 pc端包括 管理员角色和学生角色 管理员拥有 学生管理 科普知识管理 论坛管理 收藏管理 试卷管理 留言板管理 试题管理 系统管理 考试管理 学生端拥有
  • keil中下载程序界面设置

    下午在调试DAU的时候忽然出现internal command error的情况 以往是将下载器重新上电或编译器重启既可 但是今天这一招怎么也不灵光了 换一个硬件可以正常下载 不死心 试着修改下载器选项 当Connect选择为Under R
  • 游戏UI特效教程 章鱼学院UI动效基础课(68课)

    本文包含两大单元 展示类动效原型单元 可交互动效原型单元 在展示类动效单元中 我们会着重利用AE这款软件 由浅入深的 对三个案例进行学习并制作 通过学习这个单元的知识 大家可以掌握UI动效中 AE基本的使用技巧 并在带领下完成三个案例 通过
  • ts 移动端h5 拍照预览

    通过typescript实现一个简单版本 移动端 拍照 和预览功能 1 需求列表 点击拍照唤起手机后置摄像头 拍照完成在页面预览照片 2 技术实现 2 1 布局和唤起后置摄像头 唤起摄像头采用 input 里面 type file 类型 为
  • Shell脚本攻略:文本三剑客之sed

    目录 一 理论 1 sed 二 实验 1 sed命令的寻址打印 2 显示奇偶 3 查找替换 4 后向引用 5 截取版本号 6 替换IP地址 一 理论 1 sed 1 概念 sed 英文全称为stream editor流式编辑器 sed 对输