stream editor 流式编辑器
sed是Linux中的一个文件编辑工具,按行处理文件内容,可以实现插入,删除,替换等功能。更重要的是sed命令可以用script来处理文本文件,能够应对复杂的编辑需求。
sed命令语法
基本格式 sed [option] [sed.txt]
选项:
- -e <script>: 按script编辑文本并输出到控制台,但不修改原文件内容
- -f : sed.txt 调用sed脚本文件
- -i : 直接修改读取的文件内容,而不输出到终端
- -n : 安静模式,只有经过sed处理的行才会被显示出来
- -r : 使用扩展正则表达式,默认是基础正则语法
动作说明:
- a : 新增一行内容(在指定行的下一行)
- c : 取代内容,可取代n1,n2之间的行
- d : 删除行
- i : 插入一行内容(在指定行的上一行)
- p : 列印,将某个选择的资料印出,常与sed -n连用
- s : 替换,搭配正则表达式,替换文本中的内容
sed元字符集1
2
3
4
5
6
7
8
9
10
11
12
13^ : 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ : 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. : 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* : 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] : 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^] : 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) : 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& : 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< : 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> : 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} : 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} : 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} : 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
例题
1.在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”1
2
3
4
5sed 's/foo/bar/' sed.txt # 只替换每一行中的第一个“foo”字串
sed 's/foo/bar/4' sed.txt # 只替换每一行中的第四个“foo”字串
sed 's/foo/bar/g' sed.txt # 将每一行中的所有“foo”都换成“bar”
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo”
sed 's/\(.*\)foo/\1bar/' # 替换最后一个“foo”
2.在每一行中查找字串“/foo”,并将找到的“/foo”替换为“/bar”1
2sed 's/\/foo/\/bar/' sed.txt # /foo 的'/'' 需要转义
sed 's;foo;bar;' sed.txt #用 ‘;’ 作为定界符 不用转义更清晰
3.只在行中出现字串“baz”的情况下将“foo”替换成“bar”1
sed '/baz/s/foo/bar/g' sed.txt
4.不管是“scarlet”“ruby”还是“puce”,一律换成“red”1
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' sed.txt #对多数的sed都有效
5.删除文件中开头的10行1
sed '1,10d' sed.txt
6.删除文件中的最后一行1
sed '$d' sed.txt
7.删除含有cc的行,显示其余内容。1
sed '/cc/d' sed.txt
8.把含有连续3个数字的行删除1
sed '/[0-9]{3}/' sed.txt
9.删除空白行。1
sed -i '/^$/d' sed.txt
10.删除行首的空格1
2
3sed -i 's/^[ ]*//g' sed.txt
sed -i 's/^[[:space:]]*//g' sed.txt
sed -i 's/^ *//g' sed.txt
11.显示第45到50行1
sed -n '45,50p' sed.txt
12.只显示匹配cc的行1
sed -n '/cc/p' sed.txt #p是显示命令。把匹配的行显示出来,!表示不匹配则执行命令。/cc/!p
13.第一行添加hello1
sed -i '1 i\hello' sed.txt
14.最后行添加hello1
sed -i '$a\hello' sed.txt
15.在This is 2 line行前插入 THIS IS 2 Line.1
2sed -i '/This is 2 line/i THIS IS 2 LINE.' sed.txt
sed -i '/This is 2 line/i\THIS IS 2 LINE.' sed.txt
16.查看日志1
cat /var/log/secure | sed '/12:12:50/,/12:48:55/p'
17.显示ifconfig IP1
2ifconfig eth0 | grep 'inet addr' | sed 's/^.* addr://g' | sed 's/Bcast.*$//g'
ifconfig eth0 | grep "inet addr:" | awk -F[:" "]+ '{print $4}'
高级用法
单文件替换
替换test1.dat文件中的”test”为”zcx”,将结果输出到result1.dat1
sed ‘s/test/zcx/g’ ./test1.dat > result1.dat
多文件替换
grep搜索含有字符串”test”的文件,然后对每个文件执行sed命令。xargs存在的意义是避免因grep到的文件过多处理不了时造成溢出。sed -i 表示就地处理,将结果存回原文件。1
grep -rl “test” ./ | xargs sed -i ‘s/test/zhaochaoxing/g’
& 使用
& 代表匹配内容
1.将aaa替换成空行加aaa1
sed -i 's/aaa/\n&/g' sed.txt
2.bbb后添加空行1
sed -i 's/bbb/&\n/g' sed.txt
http://sed.sourceforge.net/sed1line_zh-CN.html