Linux三剑客-sed

Sed


目标

使用sed编辑文件替换文件中的单词

编写在文件中插入或修改行的sed程序

使用sed作为过滤器来过滤管道数据命令

介绍

sed (stream editor, 流编辑器) 是Linux下一款功能强大的非交互流式文本编辑器(vim是交互式文本编辑器),可以对文本文件的每一行数据匹配查询之后进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑.

sed是一种流编辑器,它一次处理一行内容, 将这行放入缓存(存区空间称为:模式空间),然后才对这行进行处理,处理完后,将缓存区的内容发送到终端。

sed处理数据原理

语法

sed [选项参数] [模式匹配/sed程序命令] [文件名]

模式匹配,sed会读取每一行数据到模式空间中, 之后判断当前行是否符合模式匹配要求,符合要求就会

执行sed程序命令, 否则不会执行sed程序命令;如果不写匹配模式,那么每一行都会执行sex程序命令

选项参数说明

选项参数 功能
-e 直接在指令列模式上进行sed的动作编辑。它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项;一行命令语句可以执行多条sed命令
-i 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-f 后跟保存了sed指令的文件
-n 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
-r ruguler 使用扩展正则表达式,默认情况sed只识别基本正则表达式 *

sed程序命令功能描述

命令 功能描述
a add新增,a的后面可以接字串,在下一行出现
c change更改, 更改匹配行的内容
d delete删除, 删除匹配的内容
i insert插入, 向匹配行前插入内容
p print打印, 打印出匹配的内容,通常与-n选项和用
s substitute替换, 替换掉匹配的内容
= 用来打印被匹配的行的行号
n 读取下一行,遇到n时会自动跳入下一行

特殊符号

命令 功能描述
! 就像一个sed命令,放在限制条件后面, 对指定行以外的所有行应用命令(取反)
{sed命令1;sed命令2} 多个命令操作同一个的行

数据准备

sed.txt文件内容

ABC

itheima itheima

itcast

123

itheima

示例:向文件中添加数据(a,i)

演示1: 指定行号的前或后面添加数据


【a, 代表在后面添加,出现在下一行 i, 代表在前面添加, 出现在上一行 $a: 最后一行后面添加】


向第三行后面添加hello

sed '3ahello' sed.txt

3 , 代表第三行

a, 代表在后面添加, 出现在下一行

注意这里没有修改源文件( -i 修改源文件 )

示例: 删除文件中的数据(d)

删除第2行

sed '2d' sed.txt

d 用于删除

2d 删除第2行


删除第1行,第4行数据

sed '1d;4d' sed.txt


删除奇数行

从第一行开始删除,每隔2行就删掉一行

sed '1~2d' sed.txt

1~2 从第1行开始, 每隔2行


删除指定范围的多行数据

sed '1,3d' sed.txt

1,3 从指定第1行开始到第3行结束


删除最后一行

sed '$d' sed.txt


删除不匹配的行

删除不匹配 itheimaitcast 的行

sed '/itheima\|itcast/!d' sed.txt

\| 是正则表达式的或者 这里|需要转义, 所以为\|

! 取反

示例:更改文件中的数据{ 【c】修改,【s】更换}

修改

将文件的第一行修改为hello

sed '1chello' sed.txt


将包含itheima的行修改为hello

sed '/itheima/chello' sed.txt


将最后一行修改为hello

sed '$chello' sed.txt




更换

将文件中的itheima替换为hello

将文件中的itheima替换为hello,默认只替换每行第一个itheima

sed 's/itheima/hello/' sed.txt

将文本中所有的itheima都替换为hello, 全局替换

sed 's/itheima/hello/g' sed.txt

g 代表匹配全局所有符合的字符


将每行中第二个匹配替换

将每行中第二个匹配的itheima替换为hello 命令

sed 's/itheima/hello/2' sex.txt


替换后的内容写入文件

将每行中第二个匹配的itheima替换为hello , 将替换后的内容写入到sed2.txt文件中

第一种方式

sed -n 's/itheima/hello/2pw sed2.txt' sed.txt

w写入

p打印, -n只是获取++处理过的++

第二种方式

sed -n 's/itheima/hello/2p ' sed.txt > sed2.txt


正则表达式匹配替换

匹配有 i 的行,替换匹配行中 t 后的所有内容为空

sed '/i/s/t.*//g' sed.txt

/t.*/ 表示逗号后的所又内容


每行末尾拼接test

sed 's/$/& test' sed.txt

& 用于拼接


每行行首添加注释 #

sed 's/^/#/' sed.txt

查询文件或管道中的数据(-n p)

查询含有 itcast 的行数据

sed -n '/itcast/p' sed.txt


管道过滤查询

管道查询所有进程中含有sshd的进程信息命令

ps -aux | sed -n '/sshd/p'

示例: 多个sed程序命令执行(-e)

将sed.txt文件中的第1行删除并将 itheima 替换为 itcast

第一种方式, 多个sed程序命令 在每个命令之前使用 -e 参数

sed -e '1d' -e 's/itheima/itcast/g' sed.txt

第二种方式

sed '1d;s/itheima/itcast/g' sed.txt

sed高级用法: 缓存区数据交换


模式空间与暂存空间介绍

  1. 首先需要明白, sed处理文件是逐行处理的, 即读取一行处理一行,输出一行;

  2. sed把文件读出来每一行存放的空间叫模式空间, 会在该空间中对读到的内容做相应处理;

  3. 此外sed还有一个额外的空间即暂存空间, 暂存空间刚开始里边只有个空行, 记住这一点;

  4. sed可使用相应的命令从模式空间往暂存空间放入内容或从暂存空间取内容放入模式空间;

    2个缓存空间传输数据的目的是为了更好的处理数据, 一会参考案例学习

命令 含义
h 模式空间 里面的内容复制到暂存空间缓存区(覆盖方式)
H 模式空间 里面的内容复制到暂存空间缓存区(追加方式)
g 暂存空间 里面的内容复制到模式空间缓存区(覆盖方式)
G 暂存空间 里面的内容复制到模式空间缓存区(追加方式)
x 交换2个空间的内容

示例: 缓存空间数据交换

演示1: 第一行粘贴到最后1行

将模式空间第一行复制到暂存空间(覆盖方式),并将暂存空间的内容复制到模式空间中的最后一行(追加方式)

bash 复制代码
sed '1h;$G' sed.txt

1h 从模式空间中将第一行数据复制到暂存空间(覆盖方式)

$G 将暂存空间中的内容复制到模式空间中最后一行(追加方式)

你可以理解复制粘贴就行,剪切板的内容就是暂存空间,然后再调出来


演示2: 第一行删除后粘贴到最后1行

将模式空间第一行复制到暂存空间(覆盖方式)并删除, 最后将暂存空间的内容复制到模式空间中的最后一行(追加方式)

cpp 复制代码
sed '1{h;d};$G' sed.txt

1{h;d}对模式空间中的第一行数据同时进行复制到暂存空间(覆盖方式)和删除模式空间中的第一行数据


演示3: 第一行数据复制粘贴替换其他行数据

将模式空间第一行复制到暂存空间(覆盖方式), 最后将暂存空间的内容复制到模式空间中替换从第2行开始到最后一行的每一行数据(覆盖方式)

cs 复制代码
sed '1h;2,$g' sed.txt

演示4: 将前3行数据数据复制粘贴到最后一行

将前3行数据复制到暂存空间(追加方式), 之后将暂存空间的所有内容复制粘贴到模式空间最后一行(追加方式)

bash 复制代码
sed '1,3H;$G' sed.txt

示例: 给每一行添加空行

插入空行

bash 复制代码
sed G -i sed.txt
# G 每行后面添加一个空行
# -i 修改源文件

示例: 删除所有的空行

bash 复制代码
​​​​​​​
sed -i '/^$/d' sed.txt
相关推荐
阿kun要赚马内2 小时前
Qt写群聊项目(一):服务器
服务器·数据库·qt
通知风来过2 小时前
docker下得dify得镜像站
运维·docker·容器
爱喝水的鱼丶2 小时前
SAP-ABAP:掌握BAPI_OUTB_DELIVERY_CONFIRM_DEC:解锁SAP自动化发货的核心钥匙
运维·学习·sap·abap·交流学习
qq_171520352 小时前
linux服务器springboot(docker)项目word转pdf中文乱码
linux·spring boot·docker·pdf·word
老兵发新帖2 小时前
Ubuntu安装fail2ban:防暴力破解
linux·运维·ubuntu
玩电脑的辣条哥2 小时前
Docker Compose 环境变量未生效与镜像标签缺失问题的排查与解决
运维·docker·容器
慧一居士2 小时前
pm2使用
运维·服务器
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [drivers][clk]clk-bulk
linux·笔记·学习
Wpa.wk3 小时前
Docker容器隔离(namespace+cgroups)-底层原理
运维·docker·容器