sed

文本处理工具 Sed

Posted by Sunday on 2018-02-23

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
5
sed '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
2
sed '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
3
sed -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.第一行添加hello

1
sed -i '1 i\hello' sed.txt

14.最后行添加hello

1
sed -i '$a\hello' sed.txt

15.在This is 2 line行前插入 THIS IS 2 Line.

1
2
sed -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 IP

1
2
ifconfig 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.dat

1
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替换成空行加aaa

1
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