sed
sed是一个“非交互式的”面向字符流的编辑器,默认情况下是不会修改原文件的。
工作原理:
一行一行处理的。
当从文件中读取一行后,首先放到模式空间中对该行进行相应的处理,处理完将结果输出到屏幕上。然后继续读取下一行内容,直到所有行都读取完毕,sed结束。
语法:
sed [选项] '模式动作' 文件...
选项:
-n: 静默输出,关闭模式空间的输出,不会输出未匹配到的行 一般与p命令结合使用
-e: 允许进行多项编辑,也就是说对同一行做多次处理、. 可以做多点编辑
-e: '动作1' -e '动作2' == '动作1;动作2'
-f: 后接sed脚本,指定执行的sed脚本(将模式动作写到文件中)
-r: 允许使用扩展正则
-i: 直接作用于原文件
-i.bak: 修改原文件之前进行备份
模式:
1. 空模式
表示所有的行都执行动作
2. 以行号作为模式
1). 单独的行号,如:1 就是处理第1行;$ 处理最后一行
2). 起始行,结束行, 如:1,5 处理第1到5行
3). 起始行~步长
每隔多少行操作一次, 如:2~2 从第2行开始,每隔1行
4). 起始位置,+N
表示从起始位置开始,后面的N行都进行处理, 如:3,+5 处理3-8行
3. 以正则作为模式
1). /正则表达式/, 如:/^root/
2). /正则表达式1/,/正则表达式2/
表示从第一次匹配到正则表达式1开始到第一次匹配到正则表达式2之间的所有行, 如:/^bin/,/sh$/
动作-----处理命令:! 非: 放在命令前面表示取反
1. d 删除 delete
2. p 打印 print
3. r 读取 read
4. w 写 write
5. a 追加 在匹配的行下面插入内容 append
6. i 插入 在匹配行的上一行插入内容 insert
7. c 修改 本行替换 change
8. y 转换的命令,一一对应转换
9. n 处理下一行 next
10. q 退出,不会再向模式空间读入新的行 quit
11. s 查找替换 '模式s/旧的内容(正则表达式)/替换内容(新的内容)/[修饰符]'
修饰符:
g:全局替换
n:n为数字,1-512 替换第n个匹配到的内容
p:打印 -n
w:把处理过的行写入到另一个文件
\u upper 大写字母
\l lower 小写字母
将文件中所有小写字母替换成大写字母:
# sed 's/[a-z]/\u&/g' /tmp/pass
模式空间:
用于处理文本行,最大保存8192字节
保留空间:
用于保留文本行,用来保存已经处理完的文本行,最大保存8192字节,默认有一个空行
置换命令:
h:将模式空间的内容复制到保留空间 —— 覆盖模式
H:将模式空间的内容追加到保留空间 —— 追加模式
g:将保留空间的内容复制到模式空间 —— 覆盖模式
G:将保留空间的内容追加到模式空间 —— 追加模式
x:将模式空间和保留空间中的内容进行交换
控制流:
! 命令取反 例: 1!d 删除第一行以外的行
{} 命令组合 命令用分号分隔 {1h;G} 可以理解为 -e 参数的另一种写法
= 打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n '2{=;p}' infile
n 读入下一行到模式空间 例:'4{n;d}' 删除第5行
N 追加下一行到模式空间.
P 输出多行模式空间的第一部分,直到第一个嵌入的换行符为止。在执行完脚本的最后一个命令之后,模式空间的内容自动输出。P命令经常出现在N命令之后和D命令之前。
D 删除模式空间中直到第一个换行符的内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用与模式空间剩余的内容。
这三个命令能建立一个输入. 输出循环,用来维护两行模式空间,但是一次只输出一行。
这个循环的目的是只输出模式空间的第一行,然后返回到脚本的顶端将所有的命令应用于模式空间的第二行。没有这个循环,当执行脚本中的最后一个命令时,模式空间中的这两行都将被输出。Sq