一. sed是一种逐行处理的流编辑器,在文本处理中非常有用。在shell等脚本文件中,可以使用sed来对文件进行替换编辑等操作。处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
二. 参数说明
- a :追加, a 的后面可以接字串,而这些字串会在当前行的下一行
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
- d :删除,因为是删除,所以 d 后面通常不加任何内容
- i :插入, i 的后面可以接字串,而这些字串会在当前行的上一行(取代当前行的行号)
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
- s :替换,对字符串进行处理,通常这个 s 的动作可以搭配正规表达式,例如 1,20s/old/new/g
三. 操作实例
1. 'p' 打印,打印通常与-n选项连用,屏蔽默认输出,只显示匹配内容
打印第1行
sed -n '1p' /etc/passwd
打印1到10行
sed -n '1,10p' /etc/passwd
打印倒数第一行
sed -n '$p' /etc/passwd
打印包含'root'的行
sed -n '/root/p' /etc/passwd
打印奇数行
sed -n '1~2p' /etc/passwd //从第一行开始,步长为2
打印偶数行
sed -n '2~2p' /etc/passwd //从第二行开始,步长也为2
2. 'd' 删除
删除包含'root'的行
sed '/root/d' /etc/passwd
删除第10行
sed '10d' /etc/passwd
删除最后一行
sed '$d' /etc/passwd
删除5到10行
sed '5,10d' /etcp/passwd
删除第5行和第10行
sed '5d;10d' /etc/passwd
3.'a' 追加
将'this a test line '追加到以root开头的行后
sed '/^root/a\this a test line' /etc/passwd
将'this a test line'追加到第5行后
sed '5a\this a test line' /etc/passwd
4. 'i'插入
将'this a test line'插入到以root开头的行前
sed '/^root/i\this a test line ' /etc/passwd
将'this a test line ' 插入到第5行前
sed '5i\this a test line ' /etc/passwd
5. 'c' 取代,c修改一整行,s仅修改某个关键词
将包含root的行替换为xxx
sed '/root/c\xxx' /etc/passwd
将第5到10行取代为'this a test line'
sed '5,10c\this a test line' /etc/passwd
6. 's'替换,加 '-i' 选项会直接修改原文件
sed -n 's/ / /p' file 搭配用显示替换的那一行
sed的/ / /可以替换为任意符号,如:sed -n 's# # #p' file
将文件中每一行的第一个bash替换为BASH
sed 's/bash/BASH/' /etc/passwd
将文件中每一行的第二个bash替换为BASH
sed 's/bash/BASH/2' /etc/passwd
将文件中所有的bash替换为BASH,加参数 ‘g’
sed 's/bash/BASH/g' /etc/passwd
将文件中包含www那一行所有的1001替换为1002
sed '/www/s/1001/1002/g' /etc/passwd
将文件中第10行的'bin'替换为'BIN'
sed '10s/bin/BIN/' /etc/passwd
将文件中第1到10行中所有的'bin'替换为'BIN'
sed '1,10s/bin/BIN/g' /etc/passwd
将文件中最后一行的'bin'替换为'BIN'
sed '$s/bin/BIN' /etc/passwd
在每行的行尾添加xxx
sed 's/$/ xxx' /etc/passwd
将passwd文件中倒数第10行中'bin'替换为'BIN'
tac /etc/passwd | sed '10s/bin/BIN/' | tac