Shell:sed工具

简介

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

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

sed处理数据原理:

image-20210709090025997

语法

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} 多个命令操作同一个的行

实战

准备数据:

vi sed.txt

QWE
shanghai shanghai
nanjing
1234
nanjing

向文件添加数据

在第三行后面添加数据

sed -i '3ahello' sed.txt

image-20210709091327674

在第三行前面添加数据

sed -i '3ihello' sed.txt

image-20210709091437766

在指定内容前后添加数据:在shanghai字符串后面插入hi

sed -i '/shanghai/ahi' sed.txt

image-20210709094055135

在最后一行后添加数据:

sed -i '$ahaha' sed.txt

image-20210709094259960

删除文件中的数据

删除第三行数据:

sed -i '3d' sed.txt

image-20210709094524115

删除奇数行:

#从第一行开始删除,每隔两行就删掉一行
#不加选项参数-i,只预览结果不修改文件
sed '1~2d' sed.txt

image-20210709095314587

删除指定范围多行数据

#删除1到3行
sed '1,3d' sed.txt

image-20210709095520623

删除不在指定范围的多行数据

#删除不在1,3行的数据
sed '1,3!d' sed.txt

image-20210709095720610

删除最后一行

sed '$d' sed.txt

image-20210709095751984

删除匹配内容的行

#删除含有hello的行
sed '/hello/d' sed.txt

image-20210709095853895

删除匹配行及其后面一行

sed '/hello/,+1d' sed.txt

image-20210709100012751

删除不匹配行

#删除不匹配shanghai或nanjing的行
sed '/shanghai|nanjing/!d' sed.txt

image-20210709100156482

更改文件数据

更改第一行

#更改第一行为hello
sed '1chello' sed.txt

image-20210709100431529

将包含shanghai的行修改为beijing

sed  '/shanghai/cbeijing' sed.txt

image-20210709100543473

将最后一行修改为hello

sed '$chello' sed.txt

image-20210709100623476

将文件中每行第一个shanghai替换为beijing

sed  's/shanghai/beijing/' sed.txt

image-20210709100818054

全局匹配替换shanghai为beijing

sed  's/shanghai/beijing/g' sed.txt

image-20210709100903525

将文件中每行第二个shanghai替换为beijing

sed  's/shanghai/beijing/2' sed.txt

image-20210709101005916

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

# 第一种方式
sed -n 's/shanghai/beijing/2pw sed2.txt' sed.txt
# w写入
# p打印, -n只是获取匹配的行

# 第二种方式
sed -n 's/shanghai/beijing/2p ' sed.txt > sed2.txt

image-20210709101242969

正则表达式匹配替换:

#匹配有 `i` 的行,替换匹配行中 `h` 后的所有内容为空 
sed '/i/s/h.*//' sed.txt

image-20210709102752847

每行末尾拼接 java

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

image-20210709102919180

每行行首添加#

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

image-20210709103055616

查询

查询含有shanghai的行

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

image-20210709103507029

多个sed执行:将sed.txt文件中的第1行删除并将 shanghai 替换为 baijing

# 第一种方式, 多个sed程序命令 在每个命令之前使用 -e 参数
sed -e '1d' -e 's/shanghai/beijing/g' sed.txt 
# 第二种方式
sed  '1d;s/shanghai/beijing/g' sed.txt

image-20210709103934210

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

模式空间与暂存空间介绍

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

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

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

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

    2个缓存空间传输数据的目的是为了更好的处理数据。

关于缓存区sed程度命令

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

案例

缓存空间数据交换

第一行粘贴到最后一行(附加方式)

sed '1h;$G' sed.txt

image-20210709111209913

第一行删除后粘贴到最后一行

sed '1{h;d};$G' sed.txt

image-20210709111359791

第一行数据复制粘贴替换其他行数据

sed '1h;2,$g' sed.txt

image-20210709111507137

将前3行数据数据复制粘贴到最后一行(追加)

sed '1,3H;$G' sed.txt

image-20210709111715162

给每一行添加空行

#暂存空间默认就有空行
sed 'G' sed.txt

image-20210709111817037

原文地址:https://www.cnblogs.com/wwjj4811/p/14989776.html