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'