内容预知
1.sed的相关知识及其工作流程
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
sed的工作流程主要包括读取、执行和显示三个过程:
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中。
怎么解决sed命令处理容量过大,或则内容过多的而导致执行效率慢的问题?
解决方案一(推荐用法):
使用split命令进行文件分割(例如文件如果是百万行,就创建一个单独的目录将文件分割为一百个为一万行的文本)再使用sed命令进行处理,除了split分割,也可以使用一个遍历分割shell脚本进行执行
解决方案二:
使用cat 文件名|sed 处理 (但是该方案只能针对中大型的文件文本,如果文本量过大,处理效果不好)
2. sed命令格式 与选项操作符
基本操作格式:
执行多条命令的格式:
方式一:
sed -n -e '操作1' -e '操作2' 文件
方式二:
sed -n -e '操作1;操作2' 文件
方式三:
sed -e 'n{
操作1
操作2
......
}' 文件1
| 选型 | 作用 |
| -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最为核心的功能是增删改查
3.sed命令的打印功能
- [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

方式一:按照行号寻求内容
- [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

4.sed的删除操作
注意:
以下的操作均为在默认情况下操作,有测试的效果,sed -i 时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作)
- [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
- [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

[root@localhost sed]#sed '/^$/d' english.txt

删除空行的三种方法:
5.sed命令替换
格式:
行范围 s/旧字符串/新字符串/替换标记
替换标记:
数字:表明新字符串将替换第几处匹配的地方
g:表面新字符串将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w 文件:将替换的结果写入文件中
sed命令的替换中:
s:替换字符串
c:整行替换
y:字符替换,替换前后的字符串长度必须相同
- [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
大写转换为小写 :
[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

经典分隔符转换案例:

使用c进行替换,是对整行内容进行替换。
- [root@localhost sed]# sed '/ONE/c 22' english.txt
-
- [root@localhost sed]# sed '/TWO/c TEST' english.txt

使用y,是对单个字符进行替换,每个字符需要一一对应,不是整体替换。前后字符串长度需要一致,不然会报错。
[root@localhost sed]# sed 'y/TH/12/' english.txt
6.sed命令的增加
a:在行后添加内容
i:在行前插入内容
r:在行后读入文件内容
- [root@localhost sed]# sed '/THREE/a 123 ' english.txt
-
-
- [root@localhost sed]# sed '/THREE/i 123 ' english.txt
[root@localhost sed]#sed '$r english2.txt' english.txt
7.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
8. 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/'
总结
1.sed命令是一种流编辑器读取文件会进行逐行读取加上指令操作,所以过大的文件一定要拆分后再交给sed处理
2.sed -r 搭配扩展正则表达式使用,使用\{n\} \{n,\} \{n,m\} 不需要加“\”
3. 用 -i 时一定要先备份(尤其对重要文件的操作),或者时先实验好确定无误时,再使用 -i
4.sed 命令 的重点在于增删改查四个功能,可以运用在脚本中对重要文件配置的修改,添加等作用尤其有效