一、介绍
sed 是一种在线的、非交互式的编辑器,在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。
二、格式
sed [options] pattern filename
三、参数和动作
参数说明:
-e 多点编辑
-f 从指定文件中读取编辑
-i.bak 备份,并对内容进行修改
-n 取消自动打印
-r 支持使用扩展正则表达式
-V 显示版本信息
-h 显示帮助
动作说明:
动作前面通常加一些匹配项
a 新增, a 后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c 取代, c 后面可以接字串,这些字串可以取代 n1,n2 之间的行
d 删除, d 通常后面不接任何咚咚
i 插入, i 后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p 打印, p 通常会与参数 sed -n 一起运行
s 取代, s 通常可以搭配正规表示法,例如 1,20s/old/new/g
= 显示匹配的行号
! 取反
四、范例
1.打印显示文本内容
sed -n '3p' test.sh # 打印文件的第3行
sed -n '$p' test.sh # 打印文件的最后一行
sed -n '3,6p' test.sh # 打印文件的第3行到第6行
sed -n '3,$p' test.sh # 打印文件的第3行到最后一行的内容
sed -n '3~2p' test.sh # 从第3行开始,每隔两行打印一行,波浪号后面的2表示步长
sed -n '/love/p' test.sh # 打印匹配love的行
sed -n '/love/,3p' test.sh # 打印从匹配love的行到第3行的内容,及后面所有匹配love的行
sed -n '/love/,$p' test.sh # 打印从匹配love的行到最后一行的内容
sed -n '/love/,+1p' test.sh # 打印匹配love的行及其向后一行,如果有多行匹配love,则匹配的每一行都会向后多打印一行
sed -n '/love/,/you/p' test.sh # 打印从匹配内容love到匹配内容you的行
sed -n '3,/love/p' test.sh # 打印第三行到匹配love的行
sed -n "$=" test.sh # 打印test.sh文件最后一行的行号
sed -n '/error/=' test.sh # 打印匹配error的行的行号
sed -n '/error/{=;p}' test.sh # 打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)
2.增加文件内容,向文件中添加或插入行
sed '3apython' test.sh # 在第三行后面添加python,3表示行号
sed '3ipython' test.sh # 在第三行之前插入python,3表示行号
sed '$apython' test.sh # 在最后一行之后添加python
sed '$ipython' test.sh # 在最后一行之前插入python
sed '/123/apython' test.sh # 在包含123的行后面添加python,如果文件中有多行包括123,则每一行后面都会添加
sed '/123/ipython' test.sh # 在包含123的行之前插入python,如果文件中有多行包含123,则每一行之前都会插入
3.删除文件中指定的行
sed '3d' 1.txt # 删除第三行
sed '$d' 1.txt # 删除最后一行
sed '1~2d' 1.txt # 从第一行开始删除,每隔2行就删掉一行,即删除奇数行
sed '1,3d' 1.txt # 删除1~3行
sed '1,3!d' 1.txt # 删除1~3之外的所有行
sed '/123/d' 1.txt # 删除匹配123的行
sed '/123/,$d' 1.txt # 删除从匹配123的行到最后一行
sed '/123/,+1d' 1.txt # 删除匹配123的行及其后面一行
sed '/^$/d' 1.txt # 删除空行
sed '/123\|abc/!d' 1.txt # 删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反
4.更改文件中指定的行
sed '1chello' test.sh # 将文件的第一行替换为hello
sed '$chello' test.sh # 将文件的最后一行替换为hello
sed '/123/chello' test.sh # 将包含123的行替换为hello
五、sed高级用法