SED是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本,与VIM编辑器类似,它一次处理一行内容,Sed可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。

在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),紧接着用SED命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或者写入文件。

逐行处理直到文件末尾,然而如果打印在屏幕上,实质文件内容并没有改变,除非你使用重定向存储输出或者写入文件。其语法参数格式为:

用法

sed [Options] 'Commands' filename

参数解释:

  • -e:允许多个编辑命令,可以一次性执行多个编辑操作。

  • -n:禁止自动打印模式空间的内容。

  • -i:直接修改文件内容,而不是输出到标准输出。

  • -r-E:启用扩展正则表达式。

  • -f:从指定文件中读取 sed 脚本。

参数/命令

说明

x

指定行号

x,y

指定从 x 到 y 的行号范围

/pattern/

查询包含模式的行

/pattern/pattern/

查询包含两个模式的行

/pattern/,x

从与 pattern 的匹配行到 x 号行之间的行

x,/pattern/

从 x 号行到与 pattern 的匹配行之间的行

x,y!

查询不包括 x 和 y 行号的行

r

从另一个文件中读文件

w

将文本写入到一个文件

y

变换字符

q

第一个模式匹配完成后退出

l

显示与八进制 ASCII 码等价的控制字符

{}

在定位行执行的命令组

p

打印匹配行

=

打印文件行号

a\

在定位行号之后追加文本信息

i\

在定位行号之前插入文本信息

d

删除定位行

c\

用新文本替换定位文本

s

使用替换模式替换相应模式

n

读取下一个输入行,用下一个命令处理新的行

N

将当前读入行的下一行读取到当前的模式空间

案例

  • 替换 yuedu.txt 文本中 old new

  sed  's/old/new/g'  yuedu.txt
  • 打印 yuedu.txt 文本第一行至第三行:

  sed  -n  '1,3p'  yuedu.txt
  • 打印 yuedu.txt 文本中第一行与最后一行:

sed  -n '1p;$p'  yuedu.txt
  • 删除 yuedu.txt 第一行至第三行、删除匹配行至最后一行:

sed  '1,3d'  yuedu.txt
sed  '/yuedu/,$d'  yuedu.txt
  • 删除 yuedu.txt 最后6行及删除最后一行:

#  N;N;N;N;N;N:连续执行 6 次 N 命令,将模式空间中的行向下移动 6 行,相当于删除了最后 6 行
sed -i '$d;N;N;N;N;N;N' yuedu.txt
  • yuedu.txt 查找 yuedu 所在行,并在其下一行添加 word 字符,a 表示在其下一行添加字符串:

sed  '/yuedu/a\word'  yuedu.txt
  • yuedu.txt 查找 yuedu 所在行,并在其上一行添加 word 字符,i 表示在其上一行添加字符串

sed  '/yuedu/i\word'  yuedu.txt
  • yuedu.txt 查找 www 的行,在其行首添加字符串 word^ 表示起始标识,& Sed 中表示添加:

sed   's/test$/&word/g'     yuedu.txt
sed  '/www/s/^/&word/'  yuedu.txt
  • 多个 sed 命令组合,使用 -e 参数:

sed  -e  '/www.jd.com/s/^/&1./'  -e  's/www.jd.com$/&./g'  yuedu.txt
  • 修改 Selinux 策略 enforcing disabled ,查找 /SELINUX/ 行,然后将其行 enforcing 值改成 disabled !s 表示不包括 SELINUX 行:

sed  -i  '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
sed  -i  '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config
  • 合并上下两行,也即两行合并:

sed  'N;s/\n/ /'  yuedu.txt