跳转至

Sed

Stream Editor,流文本编辑器,更准确地说是:行文本处理器,主要用于批量替换文本、删除行、插入行和其他简单的文本操作。

替换指令

sed -参数 "/reg/寻址s/pattern/string/标识位" filename1 filename2 ...

  • 为了防止元字符被解释为通配符,一般用单引号做引用,但如果要使用转义,则需要使用双引号
  • 分割线/也可以换成其他的
  • filename 后面可以加 > 输出重定向到其他文件
  • new如果为空,则相当于删除

参数

  • -n 仅返回处理过的行,不加默认返回所有行
  • -i 对文件实际修改,不加默认只是预览
  • -r 可使用扩展正则表达式,不加默认使用基础正则(需要转义)
  • -e 执行多个命令

标识位

  • 默认只处理每行第一次匹配到的字符,加g后则是全局匹配

寻址

  • n:第n行
  • $:最后一行

  • n,m:第n行到第m行

  • n,m!:非第n行到第m行
  • n~x:从第n行开始,每隔x行匹配一次

  • ,+x:匹配行+x行

  • ,$ :匹配行到最后一行

多指令

sed -e 's/old/new/' -e 's/old/new/' filename

sed 's/old/new/;s/old/new/' filename

sed '/正则表达式/{s/old/new/;s/old/new/}' filename

脚本文件

sed -f 脚本文件 filename

其它

sed '/xx/n' 下一行

sed '/xx/p' 打印,常与-n共用

sed '/xx/=' 打印行号

多行处理

即将多行合并为一行后再处理

模式空间

N 将下一行合并到匹配行 N;N 将下两行合并到匹配行

D 删除模式空间中第一个字符到第一个换行符

P 打印模式空间中第一个字符到第一个换行符

保持空间

  • 将模式空间内容存放到保持空间
  • h 覆盖
  • H 追加

  • 将保持空间内容取回到模式空间

  • g 覆盖
  • G 追加

  • 交换模式空间和保持空间内容

追加

a 可以使用\n达到追加多行的目的

示例

sed  -n "$="   1.txt   #打印1.txt文件最后一行的行号(即文件有多少行,和wc -l 功能类似)


“/匹配内容/要替换的内容”
    建议使用双引号,单引号内无法转义
    “/a”:匹配含有a的行
    “/a\|b”:匹配含有a或b的行
    “/^$”:匹配空行

增
    a:向匹配行后插入内容
        sed '3ahello' 1.txt
向第三行后面添加hello
    i:向匹配行前插入内容
        sed '/123/ihello'  1.txt
在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello
    r:将内容读入文件


删
    d:删除匹配行的内容
        sed '1~2d' 1.txt
删除奇数行
        sed '/xxx/d' 1.txt
删除匹配xxx的行
        sed '/^$/d' 1.txt
删除空行
        sed '/a\|b/!d' 1.txt
删除不匹配a或b的行
        sed '1,3{/a/d}' 1.txt
删除1~3行中的匹配内容a的行


改
    c:更改匹配行的内容
        sed  '/123/chello'  1.txt
将包含123的行替换为hello
    s:替换匹配行的内容
        sed  's/123/hello/'   1.txt
将文件中的123替换为hello,默认只替换每行第1个123
        sed 's/123/hello/2'   1.txt
将每行中第2个匹配的123替换为hello
        sed  's/123/hello/g'  1.txt
将文本中所有的123都替换为hello
        sed  -n 's/123/hello/gpw  2.txt'   1.txt
将每行中所有匹配的123替换为hello
并将替换后的内容打印,然后写入2.txt


查:通常与-n参数一起用
    p:打印匹配行的内容,通常与-n选项一起用
    =:打印匹配行的行号
    n:读取下一行
    w:将匹配内容写入到文件