sed是stream editor的简称,也就是流编辑器。它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i。
格式
sed [option] '[地址定界] command' file(s)
常用option,更多option请查看手册
默认输出
# cat << EOF > test
aaa
bbbb
AABBCCDD
EOF
# sed "/aaa/p" test
-n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
# sed -n "/aaa/p" test
-e:多点编辑,对每行处理时,可以有多个Script
# sed -e "s/a/A/" -e "s/b/B/" test
-f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
# cat << EOF >sed.txt
s/A/a/g
EOF
# sed -f sed.txt test
-r:支持扩展的正则表达式
sed -r "/a+/p" test.txt
+为扩展正则表达式,不加参数无法使用
-i:直接将处理的结果写入文件
# sed -i "s/a/A/g" test
-i.bak:在将处理的结果写入文件之前备份一份
# sed -i.bak "s/a/A/g" test
地址定界
- 不给地址:对全文进行处理
# sed -n "p" test
- 单地址:
- num: 指定的行 /pattern/:被此处模式所能够匹配到的每一行
# sed "2s/b/B/g" test
B替换第二行的b
- 地址范围:
- num,num
- /pattern1/,/pattern2/
- num,/pattern1/
# sed -n "1,2p" test
打印1-2行
# sed -n "/bbbb/,/DD/p" test
打印bbbb到DD
# sed -n "2,/DD/p" test
打印第2行到DD
- ~:步进
- 1~2p 只打印奇数行 (1~2 从第1行,一次加2行)
- 2~2p 只打印偶数行
# sed "1~2s/[aA]/E/g" test
替换奇数行的a或者A为E
command
- d:删除模式空间匹配的行,并立即启用下一轮循环
# sed "2d" test
删除第二行
- p:打印当前模式空间内容,追加到默认输出之后
# sed '2aap' test
在第二行后追加aa并打印
- a:在指定行后面追加文本,支持使用\n实现多行追加
# sed "2a123\n456" test
在第二行后追加多行文本
- i:在行前面插入文本,支持使用\n实现多行追加
# sed "li123\n456" test
在第一行前追加多行文本
- c:替换行为单行或多行文本,支持使用\n实现多行追加
# sed "3c123\n456" test
替换第三行内容为多行文本
- w:保存模式匹配的行至指定文件
# sed -n "3w/test2" test
将第三行保存到test2
- r:读取指定文件的文本至模式空间中匹配到的行后
# sed "1r/test2" test
将test2读取追加到test后
- =:为模式空间中的行打印行号
# sed -n "=" test
- !:模式空间中匹配行取反处理
# sed -n '2!p' test
打印除第二行的内容
- s///:查找替换,支持使用其它分隔符,如:[email protected]@@,s###;
- 加g表示行内全局替换;
- 在替换时,可以加以下命令,实现大小写转换
- \l:把下个字符转换成小写
- \L:把replacement字母转换成小写,直到\U或\E出现
- \u:把下个字符转换成大写
- \U:把replacement字母转换成大写,直到\L或\E出现
- \E:停止以\L或\U开始的大小写转换
# sed 's/[a-z]/\u&/g' test
将全文小写字母转为大写
高级编辑command
保持空间是模式空间一个临时存放数据的缓冲区,用相关命令进行保持空间和模式空间之间的操作,协助模式空间进行数据处理
参数
- h:把模式空间中的内容覆盖至保持空间中
- H:把模式空间中的内容追加至保持空间中
- g:从保持空间取出数据覆盖至模式空间
- G:从保持空间取出内容追加至模式空间
- x:把模式空间中的内容与保持空间中的内容进行互换
- n:读取匹配到的行的下一行覆盖 至模式空间
- N:读取匹配到的行的下一行追加 至模式空间
- d:删除模式空间中的行
- D:删除当前模式空间开端至\n 的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
示例(倒序输出文本)
# cat << EOF >test
One
Two
Three
EOF
# sed '1!G;h;$!d' test
示例流程解说

1.第一次处理行内容跳过G参数,直接执行h参数,然后执行d参数
2.第二次处理行内容执行G参数,再执行h参数,最后执行d参数
3.第三次处理行内容执行G参数,最后执行h参数,跳过d参数,输出内容为模式空间的内容
实例
显示偶数行
# seq 9|sed -n "n;p"
显示奇数行
# seq 9|sed 'H;n;d'
倒序显示
# seq 9|sed '1!G;h;$!d'
显示最后一行
# seq 9| sed 'N;D'
每行之间加空行
# seq 9|sed 'G'
每行内容替换成空行
# seq 9|sed 'g'
确保每行下面都有空行
# seq 9|sed '/^$/d;G'