文章目录
- 文本三剑客
- sed
- 介绍
- 命令介绍
- 打印内容
- 删除
- 替换
- 插入
- 分组
文本三剑客
sed
介绍
sed编辑器
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来
编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要
么存储在一个命令文本文件中。
sed的工作流程主要包括读取、执行和显示三个过程:
- 读取:sed从输入流 (文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重 复执行,直至所有内容被处理完。
sed对数据的处理是对缓冲区的文件进行处理,一般不会对源文件进行修改
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
对于很大的文件,流编辑器处理会非常慢,通过IO一行一行处理
处理方法:1. 将文件通过cat显示,再通过管道符传送
2. 将大文件切分成小文件再处理
命令介绍
命令格式:
sed -e '操作' 文件1 文件2
sed -n -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2
sed -e 'n{ ## n 指定行号
操作1
操作2
}' 文件1 文件2
常用选项:
-e 或 --expression= :表示用指定命令来处理输入的文本文件,只有一个操作命令时 可省略,一般在执行多个操作命令使用
-f 或 --file= :表示用指定的脚本文件来处理输入的文本文件
-h 或 --help :显示帮助
-n 、--quiet 或 silent :禁止sed编辑器输出,
但可以与 p 命令一起使用完成输出
-i :直接修改目标文本文件
常用操作:
s :替换,替换指定字符
d :删除,删除选定的行
a :增加,在当前行下面增加一行指定内容
i :插入,在选定行上面插入一行指定内容
c :替换,将选定行替换为指定内容
y :字符转换,转换前后的字符长度必须相同
p :打印,如果同时指定行,表示打印指定行;
如果不指定行,则表示打印所有内容;
如果有非打印字符,则以ASCII码输出,其通常与 -n 选项一起使用
= :打印行号
l(小写L) :打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
打印内容
sed -n -e 'p' file ##打印内容
cat file | sed -n 'p' ##只有一个操作命令 -e 可省略
cat file | sed -n '=' ##打印行号
cat file | sed -n 'l' ##打印内容包括换行符等
cat file | sed -n -e '=' -e 'p' ##同时显示行号和内容
cat file | sed -n '=;p' ##实现多个命令的同时执行
cat file | sed -n '= 回车 p'
cat file | sed -n '4p' ##打印第四行
cat file | sed -n '$p' ##打印最后一行
cat file | sed -n '1,3p' ##打印1到3行
cat file | sed -n '4p;$p' ##打印第四和最后一行
cat file | sed -n '1,+3p' ##打印第一行以及之后的连续三行
cat file | sed '5q' ##执行到第五行退出,就显示前五行
cat file | sed -n 'p;n' ##显示奇数行 ;n 表示移动到下一行
##第一次执行在第一行,通过p打印, 添加 n 将sed处理的行到第二行,结束
##第二执行时,自动到第三行,通过p打印,再自动跳转到下一行,结束执行
cat file | sed -n 'n;p' ##显示偶数行
cat file | sed -n '2,${n;p}' ##从第二行到最后行,执行 n;p 操作
cat file | sed -n '3 {p;n;n;p}' ## 只在第三行处理
##通过字符串打印行内容
## 使用 // 中间添加字符串,能使用正则表达式
cat file | sed -n '/root/p' ##将包含 root 字符串 的行打印出来
cat file | sed -n '/^root/p' ##打印以root开头的行
cat file | sed -nr '/root|ftp/p' ##同时打印两个
cat file | sed -n '/root\|ftp/p'
cat file | sed -n '2,/ftp/p' ##从第二行开始,显示到第一个FTP的内容
扩展正则要添加 -r 不添加的话要使用 \
删除
cat file | sed '3d' ##删除第三行
cat file | sed '3,5d' ##删除3到5行
cat file | sed '$d' ##删除最后一行
cat file | sed '/login$/d' ##删除以什么什么结尾的行
cat file | sed '/bash$/!d' ##删除不是以 bash 结尾的行
cat file | sed -r '/[^(bash)]$/d'
cat file | sed '/2/d' ##删除包含2的行
cat file | sed -r '/2|3/d' ##删除包括2或者3的行
cat file | sed -r '2,/3/d' ##从第二行开始删除到含有第一个3的行
cat file | sed -r '/2/,/3/d' ##从第一个包含2的行删到第一个包含3的行
cat file | sed '/2/,/3/d' ##在删除时,不会停止,在第一个结束后,还会在后 面继续找匹配的行
##从第一个包含字符串1的行开始删到第一个包含字符串2的行,之后行会重复之前的规则操作
##删除空行的方法
grep -v "^$"
tr -s '\n'
sed '/^$/d'
替换
s/abc/123/2 ##替换第二个abc为123
s/abc/123/g ##替换所有的abc
s/abc/123/p ##替换并打印行
cat file | sed -n 's/root/admin/p' ##替换root并打印替换的行
cat file | sed -n 's/root/admin/2p'
cat file | sed -n 's/root//gp' ##删除root字符不删除行
cat file | sed -n 's/^#//p'
cat file | sed -i -n 's/^/#/p' ##批量添加 # 并修改文件
cat file | sed '5,10 s/^#//' ##5到10行删除#
cat file | sed 's/^#//;n' ##删除奇数行的#
cat file | sed -n '/swap/ s/^/#/p' ##将包含字符串的行替换
cat file | sed -n '/^UUID/ s/^/#/p'
cat file | sed 's/.*swap.*/#&/' ## & 表示前面正则所匹配到的行
cat file | sed '10,20 s/^/#/w 123.txt' ##将修改的行保存到其他文件
cat file | sed -n '10,20 s/^/#/p' > 123.txt
cat file | sed -n 's/\/bin\/bash/\/sbin\/nologin'
cat file | sed -n 's#/bin/bash#/sbin/nologin#p'
##可以将分隔符替换成其他符号,数字也行
cat file | sed -n 's9\945\9\99\98\939g' ##将94599替换为9893
##把以root开头的行注释了
##将ftp都替换成mysed
##把以nologin为结尾的行删除
vim mysed
/^root/ s/^/#/
s/ftp/mysed/g
/nologin$/d
sed -f mysed /opt/file
插入
sed '10c hello world' file ##替换指定行的整行内容
sed 'y/145/abc' file ##将145转换为abc,对应关系
sed '1a 123' file ##在第一行下面插入
sed '$a 123' file ##在最后一行插入
sed '1,3a 123' file
sed '1,3i 123' file ##在指定行上面
sed '1r 123.txt' file ##在第一行后读取文件内容,实现文件合并
sed '/^#t/i 123' file ##行号可以是字符串
sed '1,3H;$G' file ##将1到3复制到最后
sed '/^$/d'
sed '1,3H;10,$G' file ##将1到3行复制到10到最后,每行都粘贴
##剪切 保持空间
sed '1,3{H;d};$G' file
分组
sed -r 's/(111)(222)(333)/\3\2\1/'
\3 代表第三组
\2 代表第二组
sed -r 's/(^.)(.*)(.$)/\3\2\1/' ##实现第一个和最后一个进行交换