目录
一、sed是什么
- 目的:sed 命令是利用脚本来处理文本文件。
- 原因:它可以依照脚本的指令来处理、编辑文本文件
- 范围:主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
二、sed为什么这样工作(原理)
- 文本:sed编辑器处理一段文本时,首先会逐行进行处理,也就是说每次只读取一行内容
- 模式空间:接着将读取的内容保存在一个临时缓存区中,这个缓存区叫做模式空间
- 屏幕输出:然后根据预先提供的规则命令匹配并修改数据;再将该行输出到屏幕上并清空模式空间
- 继续处理:sed处理完一行数据后,会继续处理下一行,不断重复这个过程,直到将文件中的所有数据处理完毕
注:sed把每一行都保存在模式空间中,对这个副本进行修改,所以默认不会修改或破坏源文件
三、sed命令该怎么操作
3.1 基本的操作选项
基本格式:
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
常见sed命令选项 | |
-e | 表示用指定命令或者脚本来处理输入的文本文件 |
-f | 表示用指定的脚本文件来处理输入的文本文件 |
-h | 显示帮助 |
-n | 表示仅显示处理后的结果 |
-i | 直接编辑文本文件 |
-r | 使用扩展正则表达式 |
-s | 将多个文件视为独立文件,而不是单个连续的长文件流 |
常见sed命令操作 | |
a | 增加:在当前行下面增加一行指定内容 |
c | 替换:将选定行替换为指定内容 |
d | 删除:删除选定的行 |
i | 插入:在选定行上面插入一行指定内容 |
p | 打印:
|
s | 替换:指定字符 |
y | 字符转换 |
3.2 怎么去使用sed
sed [option]... 'script;script;...' [input file...]
选项 自身脚本语法 支持标准输入管道
- options指的是sed的命令行参数
- script是指需要对输入执行的一个或者多个操作指令,一般需要用单引号括起来,这样可以避免shell对 特殊字符的处理。sed会依次读取输入文件的每一行到缓存中并应用script中指定的操作指令,因此而带 来的变化并不会影响最初的文件(除非option加了-i参数
- 每条操作指令由pattern和procedure两部分组成,顾名思义,pattern是匹配的规则,一般为用’/'分隔的 正则表达式(也有可能是行号,具体参见Sed命令地址匹配问题总结),而procedure则是一连串编辑命 令(action)
总结:sed命令+选项 ‘定位+动作+内容’ 文件名
3.3 操作实例
3.3.1 打印输出(-n、-p、-r)
- 如何显示范围行号,行号
- 奇偶数表示
- 特殊符号表示打印($、[0-9]、!、=)
补
- sed默认不支持扩展正则,如果要支持,需要加-r选项
- 结合管道符号
3.3.2 增加内容(i、a)
注意:a或i所有内容都会被理解为需要添加的内容
3.3.3 删除(d)
3.3.4 替换(替换的内容前加c)
c指令使得整行内容全部替换
注意:这里没有真的改变文件内容,只是输出到屏幕,如果想要真的替换,需要用-i选项,建议用-i之前对原文 件进行备份
3.3.5 搜素替换(s、g、p)
语法
s/……/……/修饰符
查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g:行内全局替换
p:显示替换成功的行
w /PATH/FILE:将替换成功的行保存至文件中
I,i:忽略大小写
注:把所有/sbin/nologin换成kgc,/需要转义
注:以sync开头的行并且前面加#号,那就需要保留sync,那就要把搜索的字符写成&
- 忽略大小写的替换
- 生产案例
3.3.6 插入文件(r)
3.3.7 另存为到文件(w +路径)
- 追加,不进行覆盖
3.3.8 同时编辑(-e)
3.3.9 分组操作{}
当我们需要对一行数据进行多次操作的时候我们可以使用{}进行分组
- 分组 s//代表查找替换
- ()代表分组
- \1 代表留下的组
- r:读取指定文件
从 ifconfig 命令的输出中提取 ens33 网卡的 IP 地址
通过 sed 的正则表达式匹配,它会找到 包含 inet 字段的行,并从中提取出 IP 地址部分,然后输出这个 IP 地址
3.3.10 读取完退出(q)
3.3.11 sed脚本
使用 sed 命令迁移符合条件的文本时,常用到以下参数.
- H:复制到剪贴板
- g、G:将剪贴板中的数据覆盖/追加至指定行
- w:保存为文件
- r:读取指定文件
- a:追加指定内容
- I,i 忽略大小写
注意:
- sed脚本文件第一行要声明#!/bin/sed -f
- 不要加单引号
- 每行的最后不能有空格等多余字符
- #号开头为注释
- 一行有多个命令时用分号隔开
- sed的返回值一般情况为0,不管是不是修改成功了,除非是语法错误 所以sed的返回值$?一般不作为sed成功的判断条件
脚本一:
3.3.12 sed的高级应用
- -r匹配正则
- 结合变量使用