sed (stream editor)流编辑器也是linux中的一条命令,在shell中经常需要用到的非交互式修改文件内容的命令。sed处理文本是按行处理,也就是读一行处理一行。
sed的命令基本格式是:
sed 选项 ‘编辑指令‘ 文件路径
也可以通过管道(|)传输参数给sed处理 前置命令 | sed 选项 ‘编辑指令‘
sed的常用参数有:
-n 屏蔽默认输出;如果不加-n选项会全部输出文本满足条件的行再重复输出
-r 如果使用扩展正则,则需要添加-r选项,默认不支持扩展正则,只支持标准正则
-i 直接修改源文件;不加-i只会在屏幕临时输出不会修改源文件,一般测试过命令无误才会在脚本中使用-i选项
sed的编辑指令:
p 输出
命令 |
完整示例 |
说明 |
p |
sed -n ‘p‘ 1.txt |
输出1.txt的所有行 |
2p |
sed -n ‘2p‘ 1.txt |
输出1.txt的第二行 |
2,5p |
sed -n ‘2,5p‘ 1.txt |
输出1.txt的第二行到第五行 |
2,+5p |
sed -n ‘2,+5p‘ 1.txt |
输出1.txt的第二行和第二行以后的5行 |
1~2p |
sed -n ‘1~2p‘ 1.txt |
输出第一行,每隔两行输出一行,也就是输出奇数行 |
2~2p |
sed -n ‘1~2p‘ 1.txt |
输出第二行,每隔两行输出一行,也就是输出偶数数行 |
/正则/p |
sed -n ‘/^[0-9]/p‘ 1.txt |
输出1.txt以数字开头的行 |
$= |
sed -n ‘$=‘ 1.txt |
输出1.txt的行数 |
d 删除
命令 |
完整示例 |
说明 |
2d |
sed ‘2d‘ 1.txt |
删除1.txt的第二行 |
2,5d |
sed ‘2,5d‘ 1.txt |
删除1.txt的第二行到第五行 |
2,+5d |
sed ‘2,+5d‘ 1.txt |
删除1.txt的第二行和第二行以后的5行 |
$d |
sed ‘$d‘ 1.txt |
删除1.txt的最后一行行 |
/正则/ |
sed ‘/^[0-9]/d‘ 1.txt |
删除以数字开始的行 |
! |
sed ‘/^[0-9]/!d‘ 1.txt |
删除不是以数字开头的行 |
^$ |
sed ‘^$‘ 1.txt |
删除1.txt的空行 |
s 替换
命令 |
完整示例 |
说明 |
s/old/new/ |
sed ‘s/old/new/‘ 1.txt |
删除1.txt中每行的第一个old都替换成new |
s/old/new/2 |
sed ‘s/old/new/‘ 1.txt |
删除1.txt中每行的第二个old都替换成new |
s/old/new/g |
sed ‘s/old/new/g‘ 1.txt |
删除1.txt中每行的每一个old都替换成new |
s/old// |
sed ‘s/old//‘ 1.txt |
删除1.txt中每行的第一个old都替换成空也就是把old删除 |
s/old/&s/ |
sed ‘s/old/&s/‘ 1.txt |
删除1.txt中每行的第一个old都替换成olds &代表前面查找的字符串 |
4,7s/^/#/ |
sed ‘4,7s/^/#/‘ 1.txt |
删除1.txt中4-7行开头加上# 也就是批量添加注释 |
4,7s/^#an/an/ |
sed ‘4,7s/^#an/an/‘ 1.txt |
删除1.txt中4-7行以#an开头的行去掉# |
替换中s///可以用其他三个相同的符号代替如s### s&&& s999 都可以 这样的符号在替换路径的时候经常用到
i/a/c插入
命令 |
完整示例 |
说明 |
行号 i |
sed ‘2i123‘ 1.txt |
在1.txt的第二行前面插入123 |
正则 i |
sed ‘/^[0-9]/i123‘ 1.txt |
在1.txt中所有数字开头的行前面插入123 |
a |
在行后插入 |
命令格式和i相同 |
c |
替换该行 |
命令格式和i相同 |
sed高级应用
命令 |
完整示例 |
说明 |
行号r |
sed -i ‘2r 2.txt‘ 1.txt |
在1.txt中第二行后面插入2.txt的内容 |
行号,行号r |
sed -i ‘2,5r 2.txt‘ 1.txt |
在1.txt中第二行到第五行每行后面插入一遍2.txt的内容 |
/正则/r |
sed -i ‘/^[0-9]/r 2.txt‘ 1.txt |
在1.txt中以数字开头的行后每行面插入一遍2.txt的内容 |
w |
sed ‘2w 3.txt‘ 1.txt |
在1.txt中第二行导出为3.txt的内容 |
w |
sed ‘2,5w 3.txt‘ 1.txt |
在1.txt中第二行到第五行导出3.txt的内容 |
/正则/r |
sed -i ‘/^[0-9]/w 2.txt‘ 1.txt |
在1.txt中以数字开头的行导出为3.txt的内容 |
shell中sed命令的用法
原文:http://blog.51cto.com/13466287/2066532