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

sed 命令格式

sed [options] edit_commands [file] # [ ] 中的内容为可选可不选

  注意:sed 和 grep 不一样,不管是否找到指定的模式,它的退出状态都是0,只有当命令存在语法错误 时,sed的退出状态才是非0

sed 支持正则表达式

sed 在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。

正则表达式是括在斜杠间的模式, 用于查找和替换,以下是sed支持的元字符。

shell sed语法_字符串

 

 

shell sed语法_sed_02

 

 sed 常用选项

shell sed语法_sed_03

 

 

 sed 常用命令选项

shell sed语法_正则表达式_04

 

 

 sed 高级命令选项

shell sed语法_正则表达式_05

 

 

 sed 替换标志

shell sed语法_字符串_06

 

 

 sed 命令使用实例

 sed 命令进行文本替换

sed 使用 s 命令来进行文本替换操作

sed 's/srcStr/dstStr/' file

  其中,srcStr 为想要替换的文本,dstStr 为将要替换成的文本。使用 s 命令时,sed 编辑器会在一 行一行地读取文件 file,并在每行查找文本 srcStr,如果找到了,则将该处的 srcStr 替换为 dstStr

/ 字符为界定符,用于分隔字符串(sed 编辑器允许使用其他字符作为替换命令中的字符串分隔 符):

sed 's!/bin/bash!/BIN/BASH!' /etc/passwd # 使用 ! 作为字符串分隔符
sed 's#3#88#g' datafile

 默认情况下,替换命令只会替换掉目标文本在每行中第一次出现的地方。若想要替换掉每行中所有 匹配的地方,可以使用替换标记 g。替换标记放在编辑命令的末尾。除了 g 外,还有几种替换标 记:

 数字指明替换掉第几次匹配到的文本

没有设置这个标记时,默认是替换第一次匹配的文本

sed 's/root/ROOT/2' /etc/passwd

  这行命令将 /etc/passwd 文件中每行的第 2 个 root 替换为 ROOT

g 替换所有匹配到的文本

sed 's/root/ROOT/g' /etc/passwd

  这行命令将 /etc/passwd 文件中的 root,全部替换为 ROOT;

p 打印与替换命令中指定模式(srcStr)相匹配的行

sed 's/root/ROOT/p' /etc/passwd

  执行这命令,会在 STDOUT 上看到包含有 root 的行被输出了两次,一次是 sed 编辑器自动输出 的;另一次则是 p 标记打印出来的匹配行 单独地使用 p 标记没什么用处,通常将 p 标记和 -n 选项结合起来使用,这样就可以只输出被匹配 替换过的行了

sed -n 's/root/ROOT/gp' /etc/passwd # 将 /etc/passwd 中 所有的 root 都替换成 ROOT,并输出被修改的行

  注:可以使用 " = " 命令来打印行号,用法与 p 一样。

w file :将替换的结果写到文件中

只保存被修改的行,与 -n + p 的功能类似

sed -n 's/root/ROOT/g w change.txt' /etc/passwd # 将
/etc/passwd 中所有的 root 都替换成 ROOT,并将被修改的行保存到文change.txt 中去