一、sed的相关知识及其工作流程
1)sed编辑器的介绍
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
2)sed 流编辑器的工作过程
sed的工作流程主要包括读取、执行和显示三个过程:
- 读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )
- 执行: 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
- 显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中
3)怎么解决sed命令处理容量过大,或则内容过多的而导致执行效率慢的问题?
解决方案一(推荐用法):
使用split命令进行文件分割(例如文件如果是百万行,就创建一个单独的目录将文件分割为一百个为一万行的文本)再使用sed命令进行处理,除了split分割,也可以使用一个遍历分割shell脚本进行执行
解决方案二:
使用cat 文件名|sed 处理 (但是该方案只能针对中大型的文件文本,如果文本量过大,处理效果不好)
二、sed命令格式与选项操作符
1)sed命令格式
基本操作格式:
- sed -e '操作' 文件1 文件2
- sed -n -e '操作' 文件1 文件2
- sed -f 脚本文件 文件1 文件2
- sed -i -e '操作' 文件1 文件2
-
执行多条命令的格式:
方式一:
sed -n -e '操作1' -e '操作2' 文件
方式二:
sed -n -e '操作1;操作2' 文件
方式三:
sed -e 'n{ 操作1 操作2 ...... }' 文件1
2)sed命令的常用选项
选型 | 作用 |
-e 或--expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-f 或--file= | 表示用指定的脚本文件来处理输入的文本文件 |
-h 或--help | 显示帮助 |
-n、--quiet或--silent | 禁止sed编辑器输出,但可以与p命令一起使用完成输出 |
-i | 直接修改目标文本文件 |
3)sed命令的操作符
操作符 | 作用 |
s | 替换,替换指定字符 |
d | 删除,删除选定的行 |
a | 增加,在当前行下方增加一行指定内容 |
i | 插入,在选定行上方插入一行指定内容 |
c | 替换,将选定行替换为指定内容 |
y | 字符转换,转换前后的字符长度必须相同 |
p | 打印行内容。如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用 |
= | 打印行号 |
l (小写L) | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
三、 sed命令的打印功能
1)默认打印方式
无要求的默认打印
[root@localhost sed]#sed -e 'p' english.txt
[root@localhost sed]#sed -n 'p' english.txt
打印时对行号的操作
[root@localhost sed]#sed -n '=' english.txt
[root@localhost sed]#sed -n '=;p' english.txt
sed命令的寻址打印
①以数字形式打印行区间
方式一:按照行号寻求内容
[root@localhost sed]#sed -n '1p' english.txt
[root@localhost sed]#sed -n '4p' english.txt
[root@localhost sed]#sed -n '$p' english.txt
方式二:进行行号范围区间的打印
[root@localhost sed]#sed -n '1,3p' english.txt
[root@localhost sed]#sed -n '5,$p' english.txt
[root@localhost sed]#sed -n '5,+2p' english.txt
[root@localhost sed]#sed -e '5q' english.txt
方式三:指定间隔打印
[root@localhost sed]#sed -n -e '5p' -e'$p' english.txt
[root@localhost sed]#sed -n -e '2p' -e'3p' english.txt
方式四:对奇数行和偶数行的打印
[root@localhost sed]#sed -n 'n;p' english.txt
[root@localhost sed]#sed -n 'p;n' english.txt
②文本模式过滤行内容
方式一:对包含的字符串进行过滤打印
[root@localhost sed]#sed -n '/o/p' english.txt
[root@localhost sed]#sed -n '/th/p' english.txt
方式二:应用基础正则表达式进行打印
[root@localhost sed]#sed -n '/^root/p' /etc/passwd
[root@localhost sed]#sed -n '/bash$/p' /etc/passwd
[root@localhost sed]#sed -n '4,/bash$/p' /etc/passwd
方式三:使用扩展正则表达式进行打印
注意:
sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\
[root@localhost sed]#sed -r -n '/(99:){2,}/p' /etc/passwd
[root@localhost sed]#sed -r -n '/^root|bash$/p' /etc/passwd
四、sed的删除操作
注意:
以下的操作均为在默认情况下操作,有测试的效果,sed -i 时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作)
1)通过行号进行删除
[root@localhost sed]#sed -n '3d;p' english.txt
[root@localhost sed]#sed -n '5,8d;p' english.txt
[root@localhost sed]#sed -n '5,$d;p' english.txt
[root@localhost sed]#sed '4,6!d' english.txt
2)匹配字符串内容删除
[root@localhost sed]#sed '/one/d' english.txt
[root@localhost sed]#sed '/one/,/six/d' english.txt
[root@localhost sed]#sed '/one/,/six/!d' english.txt
[root@localhost sed]#sed '/six/!d' english.txt
3)字符串搭配正则进行删除
[root@localhost sed]#sed '/^$/d' english.txt
删除空行的三种方法:
- grep -v "^$" file.txt //过滤出非空行
- cat file.txt |tr -s "\n" //压缩换行符
- sed '/^$/d' file.txt //删除空行
五、sed命令替换
格式:
行范围 s/旧字符串/新字符串/替换标记
替换标记:
数字:表明新字符串将替换第几处匹配的地方
g:表面新字符串将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w 文件:将替换的结果写入文件中
sed命令的替换中:
s:替换字符串
c:整行替换
y:字符替换,替换前后的字符串长度必须相同
1)字符串的替换
匹配单字符进行替换
[root@localhost sed]#sed -n 's/root/test/2p' /etc/passwd
[root@localhost sed]#sed -n 's/root/test/gp' /etc/passwd
[root@localhost sed]# sed -n '/^root/ s/^/#/p' /etc/passwd
2)进行字母字符进行大小的替换
大写转换为小写
[root@localhost sed]#sed -i 's/[A-Z]/\l&/g' english.txt
小写转换为大写
[root@localhost sed]#sed -i 's/[a-z]/\u&/' english.txt
[root@localhost sed]#sed -i 's/[a-z]/\U&/' english.txt
[root@localhost sed]#sed -i 's/[a-z]/\U&/g' english.txt
3)知识扩充 “//”是可以被其他符号所替换的
经典分隔符转换案例
此时9代替/的作用,加上\才为数字9,否则为分隔符
4)整行替换
使用c进行替换,是对整行内容进行替换
[root@localhost sed]# sed '/ONE/c 22' english.txt
[root@localhost sed]# sed '/TWO/c TEST' english.txt
[root@localhost sed]# sed 'y/TH/12/' english.txt
5)单字符的替换
#使用y,是对单个字符进行替换,每个字符需要一一对应,不是整体替换。前后字符串长度需要一致,不然会报错
[root@localhost sed]# sed 'y/TH/12/' english.txt
六、sed命令的增加
a:在行后添加内容
i:在行前插入内容
r:在行后读入文件内容
1)sed 命令行插入
[root@localhost sed]# sed '/THREE/a 123 ' english.txt
[root@localhost sed]# sed '/THREE/i 123 ' english.txt
2)sed命令行后读取文件插入
[root@localhost sed]#sed '$r english2.txt' english.txt
七、sed 命令进行复制粘贴
#H复制、d删除、G粘贴到指定行下方
[root@localhost sed]#sed '1,3 {H;G};$G' english.txt
[root@localhost sed]#sed '1,3 {H;d};$G' english.txt
八、sed命令中字符串和字符的位置交换
[root@localhost sed]#echo 123abc|sed -r 's/(123)(abc)/\2\1/'
[root@localhost sed]#echo 123abc|sed -r 's/(.)(.)(.)(.)(.)(.)/\6\5\4\3\2\1/'