一.sed 概述
1.sed 介绍
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个
命令文本文件中。
2.sed 的工作流程
读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
3.常用的选项
-e 或--expression=:表示用指定命令来处理输入的文本文件,
只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h 或--help:显示帮助。
-n --quiet 或 silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。
p 打印功能
-i 直接修改目标文本文件。
4.命令格式
sed -e '操作命令' 目标文件 .... #在命令行指定操作命令处理文件行数据
sed -e '操作' 文件1 文件2 ...
sed -n -e '操作' 文件1 文件2 ...
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
sed -e 'n{
操作1
操作2
...
}' 文件1 文件2 ...
二.sed 的常用操作
s:替换,替换指定字符。
d:删除,删除选定的行。
a:增加,在当前行下面增加一行指定内容。
i:插入,在选定行上面插入一行指定内容。
c:替换,将选定行替换为指定内容。
y:字符转换,转换前后的字符长度必须相同。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;
如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
=:打印行号。
l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
1.打印内容功能
(1)sed 的 p 选项
打印内容 p(打印行内容) =(打印行号) l(打印ASCII字符)
(2)打印指定的地址
sed编辑器有2种寻址方式:
【1】以数字形式表示行区间
【2】用文本模式来过滤出行
sed -n -e 'n;p' test1.txt 的演示过程
第一次过程 读取 第一行 执行 先n 跳到到下一行 (第二行) 再p 打印第二行内容
第二次过程 读取 第三行 执行 先n 跳到到下一行 (第四行) 再p 打印第四行内容
第三次过程 读取 第五行 执行 先n 跳到到下一行 (第六行) 再p 打印第六行内容
sed -n -e '2,${n;p}' test1.txt
第一次过程 读取 第二行 执行 先n 跳到下一行 (第三行) 再p 打印第三行内容
第二次过程 读取 第四行 执行 先n 跳到下一行 (第五行) 再p 打印第五行内容
第三次过程 读取 第六行 执行 先n 跳到下一行 (第七行) 再p 打印第七行内容
sed 默认只支持默认正则表达式使用,想要使用扩展表达式需要加上 - r 选项
联合使用
2. 删除功能
sed 的 的选项
拓展:在一个脚本文件里定义操作命令
sed -f 脚本文件 目标文件 ....
使用指定脚本文件里的操作命令处理文件行数据
提前在文件里定义一个操作可以指定文件加上 - f 选项进行操作处理;也可以进行多行操作。
vim a.sh
p;n
vim a.txt
=
p;n
拓展2:sed -i
3.替换功能
替换 s(字符串替换) c(整行内容替换) y(对应字符替换)
行范围 s/旧字符串/新字符串/替换标记
4种替换标记:
数字: 表明新字符串将替换第几处匹配的地方
g: 表明新字符串将会替换所有匹配的地方
p: 打印与替换命令匹配的行,与-n一起使用
w 文件: 将替换的结果写到文件中
如果想要删除root字符
如果想要删除 /etc/yum.conf 文件里的第15行到第26行删除注释
如果想要/etc/yum.conf 文件里第1行到第12行加上注释
如果想要只注释 /etc/fstab 文件里的 swap
如果想要给编辑的文件新保存;可以使用重定向输出的方式,也可以通过sed 命令 w 操作来保存,不过只会保存修改的内容。
sed 's/.*swap.*/#&/w /opt/fstab2' /etc/fstab
拓展:/ 可以被替换
sed -e 's/\bin\/bash/\/sbin\/nologin/g' /etc/passwd
sed -e 's#bin/bash#/sbin/nologin#g' /etc/passwd
两者效果一样, / 可以替换成任意符号都可以做到替代\的作用
sed 's9\945\9\99\98\939g' test.txt 的含义
将\954\9\9 替换成 \98\93
替换的高级功能
sed -e '行号c 新行内容'
sed -e '/字符串/c 新行内容'
sed -e 'y/旧字符/新字符/'
4.插入功能
a(在指定行下面插入行内容)
i(在指定行上面插入行内容)
r(在指定行下面插入整个文件内容)
sed -e '行号区间a 行内容'
sed -r -e '/字符串或正则/a 行内容'
sed -e '行号区间i 行内容'
sed -r -e '/字符串或正则/i 行内容'
sed -e '行号区间r 文件'
读入文件内容
5.复制粘贴功能
H(复制指定行到剪切板) G(将剪切板内容粘贴到指定行下面)
sed -e '1,3H;$G' #将1-3行内容复制粘贴到最后一行下面
sed -e '1,3{H;d};$G' #将1-3行内容剪切粘贴到最后一行下面
拓展:将echo 11122233 替换成 321321321;将每个字符用()括起来重新用 \ 分配位置即可