sed(stream editor)是一个行编辑器, 以“行”为处理单位,处理后的结果会输出到标准输出。处理时,sed把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。而原文件内容并没有改变,除非使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。


1. sed的命令格式:

sed [options] "script" FILE1 ...

"script" 通常由"地址定界/command"或"/pattern/command"组成, /pattern/可以使用正则表达式。

例如:sed -n "/^#/p" /etc/fstab  -- 将/etc/fstab中#开头的行显示到屏幕


2. 常用选项[options]:

-n: 静默(silent)模式,即不输出模式空间中的内容,只显示script处理后的结果;

-e: 指定在一个sed命令中使用多个script,格式为-e 'script1' -e 'script2' ...

-i: 直接修改原文件;

-r: 支持使用扩展正则表达式元字符;

-f /path/to/sed_script: 从文件中读取处理脚本,并执行;


3. 地址定界:

start_line,end_line: 例如1,7
start_line,/pattern/: 例如3,/^#/  从指定行开始,找到第一个被匹配的行。

/pattern/: 仅匹配被模式到的行;


4. 常用编辑命令:
p: 打印到屏幕,通常会与选项 -n 同时使用

d: 删除符合条件的行


# sed "2d" a.txt --删除a.txt文件的第二行。
# sed "3,$d" a.txt --删除a.txt文件的第三行到末尾所有行。
# sed "$d" a.txt --删除a.txt文件的最后一行。
# sed "/test/d" a.txt --删除a.txt文件所有包含test的行。


a \text:append,在符合条件的行后面添加指定的内容;在的添加的内容中间使用“\n”能够完成多行附加;
i \text:insert, 在符合条件的行前面添加指定的内容;在的添加的内容中间使用“\n”能够完成多行附加;

c \text: change, 将符合条件的行替换为指定的文本;


# sed "1c\#!/bin/bash" file1 --把第一行替换成#!/bin/bash
r /path/to/somefile: read, 在符合条件的位置读入指定的文件;
w /path/to/somefile: write, 将符合条件的行保存至指定文件中;

=: 显示匹配到的行的行号;

s: 字符的查找替换,s@要查找的内容@替换为的内容@ , "@"也可以用"/" "#" 代替。

   要查找的内容:可以使用模式

   替换为的内容:不可以使用模式,但可以引用, &

# sed "s@test@mytest@g" file1 --在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
# sed -n "s/^test/mytest/p" file1 --(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
# sed "s/^192.168.0.1/&localhost/" file1 --&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
# sed -n "s/\(love\)able/\1rs/p" file1 --love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
# sed "s#10#100#g" file1 --不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。