sed相关知识
目录
1、sed是什么
2、sed的原理
3、sed 命令常见用法
3.1 简版理解命令选项
3.2 sed 命令用法示例
1、sed是什么
sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
2、sed的原理
sed 的工作流程主要包括读取、执行和显示三个过程。
读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模 式空间,pattern space)。
执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。 在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
sed 的工作流程主要包括读取、执行和显示三个过程。
读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模 式空间,pattern space)。
执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。 在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除 非是用重定向存储输出。
3、sed 命令常见用法
sed [选项] '操作' 参数 sed [选项] -f scriptfile 参数
3.1 简版理解命令选项
选项 含义
-e 进行多次编辑
-n 取消默认输出
-f 指定sed文件名
-i 直接在源文件中修改
-r 使用扩展正则表达式
sed常用命令动作
命令动作 含义
p 打印输出
d 删除指定行
i 在指定行之前插入内容
a 在指定行后面插入内容
c 替换指定行所有内容
s 搜索替换
3.2 sed 命令用法示例
以 demo 文件为例进行演示。
3.3.1 输出符合条件的文本(p 表示正常输出)
sed -n 'p' demo #输出所有行跟cat demo输出效果一样
sed -n '3p'
sed -n '/the/p' demo #输出包含the的行
sed -n '4,/the/p' demo #输出从第四行到出现the的行
sed -n '/^PI/p' demo #输出以PI开头的行
sed -n '/[0-9]$/p' demo #输出以数字结尾的行
sed -n '/\<wood\>/p' demo #输出包含单词wood的行
3.3.2 删除符合条件的文本(d)
因为后面的示例还需要使用测试文件 demo,所以在执行删除操作之前需要先将测试文件备份。以下示 例分别演示了 sed 命令的几种常用删除用法。
下面命令中 nl 命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果
nl demo|sed '3d' #删除第三行
nl demo|sed '3,5d' #删除第三到五行
nl demo|sed '/cross/d' #删除包含cross的行
sed '/^[a-z]/d' demo #删除以小写字母开头的行
sed '/\.$/d' demo #删除所有以.结尾的行
去除行尾的空格?
3.3.3 替换符合条件的文本 在使用 sed 命令进行替换操作时需要用到 s(字符串替换)、c(整行/整块替换)、y(字符转换) 命令选项,常见的用法如下所示。
sed 's/the/THE/' demo #将所有行第一个the用THE替代
sed 's/l/L/2' demo #将所有行中第二个l替换成L
sed 's/the/THE/g' demo #将所有行中的所有the替换为THE
sed 's/o//g' demo #将所有行的所有o替换为空字符串,即删除所有o
sed 's/^/#/' demo #在所有行的行首插入#
sed 's/$/EOF' demo #在所有行的行尾添加EOF
sed '3,5s/the/THE/g' demo #将第三到五行的所有the替换为THE
sed '/the/s/o/O/g' demo #将所有含the的行中的所有o替换为O
3.3.4 迁移符合条件的文本 在使用 sed 命令迁移符合条件的文本时,常用到以下参数
H:复制到剪贴板
d:删除模式空间内容,开始下一个循环(不输出当前行)
g、G:将剪贴板中的数据覆盖/追加至指定行
w:保存为文件
r:读取指定文件
a:追加指定内容。具体操作方法如下所示
I,i 忽略大小写
sed 'the/{H;d};$G/' demo #将所有行中含the的行复制并且删除,然后粘贴到末行
sed '/the/{H;d};17G' demo #将所有行中含the的行复制并且删除,粘贴到第17行后,因为实例文本并没有17行,所以没有显示
sed '/the/w out.file' demo #将所有行中含the的行保存在out.file文件中
sed '/the/r /etc/hostname' demo #在含the的行后插入主机名
sed '3a黄焖鸡' demo #在第三行后插入黄焖鸡
sed '/the/a黄焖鸡' demo #在所有含the的行后插入黄焖鸡
sed '3a黄焖鸡\n兰州拉面' demo #在第三行后插入黄焖鸡和兰州拉面
3.3.5 使用脚本编辑文件
使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用。
例如执行以下命令即可将第 1~5 行内容转移至第 16 行后。
vim opt.list
sed -f opt.list demo