sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临 时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成 后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操 作;编写转换程序等。
sed 命令格式
sed [options] edit_commands [file] # [ ] 中的内容为可选可不选
注意:sed 和 grep 不一样,不管是否找到指定的模式,它的退出状态都是0,只有当命令存在语法错误 时,sed的退出状态才是非0
sed 支持正则表达式
sed 在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。
正则表达式是括在斜杠间的模式, 用于查找和替换,以下是sed支持的元字符。
sed 常用选项
sed 常用命令选项
sed 高级命令选项
sed 替换标志
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 中去