Linux sed 命令

Linux sed命令是利用script来处理文本文件。sed可依照script的指令,来处理、编辑文本文件。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

I. 语法

1
sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明:

  • -e<script>--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h--help 显示帮助。
  • -n--quiet--silent 仅显示script处理后的结果。
  • -V--version 显示版本信息。

动作说明

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c的后面可以接字串,这些字串可以取代 \(n_1\)\(n_2\)之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

II. 实例

Linux sed命令
sed命令详解

命令中的三根斜线分隔符可以换成别的符号。特殊字符需要使用反斜线\进行转义,但是单引号是没有办法用反斜线\转义的,这时候只要把命令中的单引号改为双引号就行了。

II.I. 查看

1
2
# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log

II.II. 替换

查找与替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sed 's/原字符串/替换字符串/'
sed 's?原字符串?替换字符串?' //自定义分隔符为问号
sed "s/原字符串包含'/替换字符串包含'/" //要处理的字符包含单引号

# 可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个
sed 's/原字符串/替换字符串/' //替换所有匹配关键字

# 替换样式可以多个在同一条命令中执行,用分号分隔
sed 's/^/添加的头部&/g; s/$/&添加的尾部/g'

# 上箭头”^”表示行首
# 美元”$”符号如果在引号中表示行尾
# 但是在引号外却表示末行(最后一行)
sed 's/^/添加的头部&/g' //在所有行首添加
sed 's/$/&添加的尾部/g' //在所有行末添加
sed '2s/原字符串/替换字符串/g' //替换第2行
sed '$s/原字符串/替换字符串/g' //替换最后一行
sed '2,5s/原字符串/替换字符串/g' //替换2到5行
sed '2,$s/原字符串/替换字符串/g' //替换2到最后一行

# 在文件夹中批量替换
# 在其他文件夹
sed -i “s/oldstring/newstring/g” `grep oldstring -rl yourdir`
# 在当前文件夹
sed -i "s/wordcount/symbols_count/g" `grep wordcount -rl ./`

II.III. 插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 在某行(指具体行号)前或后加一行内容
# 在第2行前插入ttt,并且将结果更新到a.txt(如果不想将插入真正更新到文件,去掉后面的-i选项就可以)
sed '2 ittt' -i a.txt
# 在第2行后插入ttt,并且将结果更新到a.txt(如果不想更新原文件,去掉-i)
sed '2 attt' -a a.txt
# 在指定的多行前面插入
sed 'n,m ittt' -i a.txt
# 在指定的多行后面插入
sed 'n,m attt' -a a.txt

# 插入另外一个文件的内容
# 匹配naughty这个单词并且在该行的下一行开始插入dd文件的内容
sed '/naughty/r dd' data

# 配合find查找的内容处理
find . -name server.xml|xargs sed -i '/directory/i <!--'
find . -name server.xml|xargs sed -i '/pattern="%h/a -->'

II.IV. 删除

1
2
3
4
5
6
7
8
9
10
11
12
sed '2,5d' datafile
#删除第二到第五行
sed '/My/,/You/d' datafile
#删除包含"My"的行到包含"You"的行之间的行
sed '/My/,10d' datafile
#删除包含"My"的行到第十行的内容

# 删除指定行的上一行或下一行
删除指定文件的上一行
sed -i -e :a -e '$!N;s/.*n(.*directory)/1/;ta' -e 'P;D' server.xml
删除指定文件的下一行
sed -i '/pattern="%/{n;d}' server.xml