sed 命令

sed(Stream Editor)是一个文本解析转换工具。它从输入流(文件、管道、标准输入)读取内容,一次只处理一行内容,每次取一行内容放入缓存区(又称模式空间)并处理,处理完后再送往输出流,如此循环处理所有行。

sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等,广泛应用于shell脚本中。

sed命令都是在模式空间内执行的,因此输入的文件并不会发生变化,除非是用重定向存储输出

语法

sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

选项

  • -e 脚本,--expression=脚本 用指定的sed脚本来处理输入的文本文件。
  • -f 脚本文件,--file=脚本文件 用指定的sed脚本文件来处理输入的文本文件。
  • -i[SUFFIX] 直接编辑文本文件,如果指定了[SUFFIX]会使用这个SUFFIX作为文件扩展名备份
  • -n 或--quiet 或--silent 仅显示sed脚本处理后的结果。
  • -s, --separate 将输入文件视为各个独立的文件而不是一个长的连续输入。
  • -r, --regexp-extended 在脚本中使用扩展正则表达式。

sed的文本“操作”选项用行为包括增、删、改、打印,这些操作组成了sed脚本。通常格式为:"[n1[,n2]]操作选项",n1、n2是可选的,表示选择进行操作的行数。

操作指令

  • a :新增, 在当前行下面增加一行指定内容。
  • c :行替换,替换选定行之间的内容。
  • d :删除, 删除选定行。
  • i :插入, 在选定行上面插入一行指定内容,注意与a的区别。
  • p :打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印出所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。可以正则表达式结合搜索显示
  • q :退出sed脚本命令
  • s :替换,替换指定字符,可以利用正则表达式替换。
  • r file: 将file文件内容插入到当前数据流
  • w file:将缓冲区中的内容写到指定的 file 文件中
  • y :单字符替换

sed脚本格式可以概括为两种:

addressCOMMAND
address{COMMAND1;COMMAND2}
  • address 表示寻址符,即寻找要操作的位置,分为按行或文本模式匹配寻找。如:'3p'打印第三行,/pattern/p打印pattern匹配的行
  • COMMAND 表示操作指令,多个时使用{}包围,并用;分隔。如:'3c xxx' 替换第三行内容

示例

先创建一个test.txt文件,后面的示例均以该文件为主,内容如下:

$ cat test.txt

This is an sed test file
Linux test
Welcome sed's world
very good defz.cn


-p打印/显示操作示例

# 不带任何行限定,-p会打印所有内容
[root@zyc-vm Documents]# sed -n 'p' test.txt 
This is an sed test file
Linux test
Welcome sed's world
very good defz.cn

# 'np' 打印第n行内容
[root@zyc-vm Documents]# sed -n '2p' test.txt 
Linux test

# 打印第n行内容不使用-n选项,输出处理结果同时会输出模式空间处理过的每一行内容
[root@zyc-vm Documents]# sed '2p' test.txt 
This is an sed test file
Linux test
Linux test
Welcome sed's world
very good defz.cn

# 'n1,n2p' 打印n1到n2行之间的内容
[root@zyc-vm Documents]# sed -n '2,3p' test.txt 
Linux test
Welcome sed's world

# 'n1p;n2p' 打印n1行和n2行的内容
[root@zyc-vm Documents]# sed -n '2p;4p' test.txt 
Linux test
very goods defz.cn

# 'p;n' 打印奇数行内容
[root@zyc-vm Documents]# sed -n 'p;n' test.txt 
This is an sed test file
Welcome sed's world

# 'n;p' 打印偶数行内容
[root@zyc-vm Documents]# sed -n 'n;p' test.txt 
Linux test
very goods defz.cn

使用模式匹配搜索

# '/pattern/p' 搜索出包含pattern匹配内容的行,pattern可以是普通字符串或正则表达式,如果需要扩展正则表达式加-r选项
[root@zyc-vm Documents]# sed -n '/test/p' test.txt 
This is an sed test file
Linux test
[root@zyc-vm Documents]# sed -n '/[g|o]/p' test.txt 
Welcome sed's world
very goods defz.cn

# '/pattern1/,/pattern2/p' 搜索出匹配包含pattern1和2的行之间的内容
[root@zyc-vm Documents]# sed -n '/Linux/,/devfz/p' test.txt 
Linux test
Welcome sed's world
very goods defz.cn

#  搜索时间范围内的日志,这里搜索15号4:00-4:50范围内日志
[root@zyc-vm Documents]# nl /var/log/messages |sed -n -r '/15 04:00:[0-9]{2}/,/15 04:50:[0-9]{2}/p'
     4	Aug 15 04:00:01 localhost systemd: Started Session 173 of user root.
     5	Aug 15 04:01:01 localhost systemd: Started Session 174 of user root.
     6	Aug 15 04:10:02 localhost systemd: Started Session 175 of user root.
     7	Aug 15 04:20:01 localhost systemd: Started Session 176 of user root.
     8	Aug 15 04:30:01 localhost systemd: Started Session 177 of user root.
     9	Aug 15 04:40:01 localhost systemd: Started Session 178 of user root.
    10	Aug 15 04:50:01 localhost systemd: Started Session 179 of user root.

这里结合了nl命令,nl命令用于带行号输出内容,查看nl命令


a,i 新增操作

[n]a 第n行后添加一行,并将结果输出到标准输出,新增内容如果有空格应该用引号引起来

[root@zyc-vm Documents]# sed -e '2a\i am new line' test.txt
This is an sed test file
Linux test
i am new line
Welcome sed's world
very goods defz.cn

# -i新增内容保存到文件,即直接修改文件而不是打印出来
[root@zyc-vm Documents]# sed -i '2a\i am new line' test.txt
[root@zyc-vm Documents]# cat test.txt 
This is an sed test file
Linux test
i am new line
Welcome sed's world
very goods defz.cn

# 在包含This的行后加That
[root@zyc-vm Documents]# sed -e '/This/aThat' test.txt 
This is an sed test file
That
Linux test
i am new line
Welcome sed's world
very good defz.cn


# 多行内容以\换行
[root@zyc-vm Documents]# sed -e '5a\not last line \
> end line' test.txt

This is an sed test file
Linux test
i am new line
Welcome sed's world
very goods defz.cn
not last line 
end line
  1. 如果不指定行号会在每一行后都新增
  2. 如果行号超出总行数不会有任何修改

[n]i 在第n行前添加一行,即插入操作

[root@zyc-vm Documents]# sed -e '2i\i am insert new line' test.txt
This is an sed test file
i am insert new line
Linux test
i am new line
Welcome sed's world
very goods defz.cn

c,s,y指令 替换操作

[n1,[n2]]c 整行替换

# 替换第2行
[root@zyc-vm Documents]# nl test.txt | sed '2c replace line'
     1	This is an sed test file
replace line
     3	i am new line
     4	Welcome sed's world
     5	very goods defz.cn

# 替换第2到4行
[root@zyc-vm Documents]# nl test.txt | sed '2,4c replace line'
     1	This is an sed test file
replace line
     5	very goods defz.cn

[n1,[n2]]s/pattern/[replaceChars]/[g|num] 搜索并替换字符串:

  • [n1,[n2]] 限定搜索行数
  • pattern 匹配模式,可以是字符串或正则
  • replaceChars替换的新字符串(为空表示删除)
  • g开启全局搜索,否则只是替换每行匹配到的第一个结果
  • num表示替换每行匹配第几个结果
# 将小写e替换为大写E
[root@zyc-vm Documents]# sed -e 's/e/E/' test.txt 
This is an sEd test file
Linux tEst
i am nEw line
WElcome sed's world
vEry good defz.cn

[root@zyc-vm Documents]# sed -e 's/e/E/g' test.txt 
This is an sEd tEst filE
Linux tEst
i am nEw linE
WElcomE sEd's world
vEry good dEfz.cn

# 将每行的第二个s替换为大写的S
[root@zyc-vm Documents]# sed -e 's/s/S/2' test.txt 
This iS an sed test file
Linux test
i am new line
Welcome sed'S world
very good defz.cn

# 正则查找替换
[root@zyc-vm Documents]# sed -e 's/a[a-z]/a2/g' test.txt 
This is a2 sed test file
Linux test
i a2 new line
Welcome sed's world
very good defz.cn

# 正则分组的使用,将匹配正则(te)(st)的串用第一个匹配的分组字符替换
[root@zyc-vm Documents]# sed -re 's/(te)(st)/\1/' test.txt 
This is an sed te file
Linux te
i am new line
Welcome sed's world
very good defz.cn

# 多组命令执行,将匹配a[a-z]的行中的This替换为That,再将行中的t替换为T
[root@zyc-vm Documents]# sed -e '/a[a-z]/{s/This/That/;s/t/T/g}' test.txt 
ThaT is an sed TesT file
Linux test
i am new line
Welcome sed's world
very good defz.cn

s/pattern//g,删除匹配字符

w file 将替换后的内容行写入新文件

# 替换字符串,并将替换后的行写入新文件中
[root@zyc-vm Documents]# sed -e 's/a[a-z]/a2/g w new.txt' test.txt 
This is a2 sed test file
Linux test
i a2 new line
Welcome sed's world
very good defz.cn

# 新文件new.txt的内容是被替换的两行内容
[root@zyc-vm Documents]# cat new.txt 
This is a2 sed test file
i a2 new line

[root@zyc-vm Documents]# cat test.txt 
This is an sed test file
Linux test
i am new line
Welcome sed's world
very good defz.cn

同样结合s操作 -i选项可以直接修改文件内容

y/oldchars/newchars/ y指令单字符替换,比如y/abc/123/ 会按顺序将a替换为1,b替换为2,c替换为3。注意,s是整个字符串符合才整个替换。

[root@zyc-vm Documents]# cat test.txt 
This is an sed test file
Linux test
i am new line
Welcome sed's world
very good defz.cn

[root@zyc-vm Documents]# sed -e 'y/isa/ISA/' test.txt 
ThIS IS An Sed teSt fIle
LInux teSt
I Am new lIne
Welcome Sed'S world
very good defz.cn

oldchars和newchars长度必须一样,否则会报错


d指令 删除操作

# 'nd' 删除单行
[root@zyc-vm Documents]# nl test.txt | sed '2d' 
     1	This is an sed test file
     3	i am new line
     4	Welcome sed's world
     5	very good defz.cn

# 'n1,n2d' 删除n1到n2行间的内容     
[root@zyc-vm Documents]# nl test.txt | sed '2,4d' 
     1	This is an sed test file
     5	very good defz.cn

# 'n,$d' 删除每n到尾行的内容(包括第n行)
[root@zyc-vm Documents]# nl test.txt | sed '2,$d' 
     1	This is an sed test file

# '/pattern/d' 删除包含匹配模式的行
[root@zyc-vm Documents]# cat test.txt 
This is an sed test file
Linux test
i am new line
Welcome sed's world
very good defz.cn

[root@zyc-vm Documents]# sed '/a[a-z]/d' test.txt 
Linux test
Welcome sed's world
very good defz.cn

d不限制行时会清空文件内容,如sed 'd' test.txt


r指令 插入文件

# 将文件rfile.txt的内容插入到test.txt第二行之后
[root@zyc-vm Documents]# cat rfile.txt 
block file
noblick stream

[root@zyc-vm Documents]# sed '2r rfile.txt' test.txt 
This is an sed test file
Linux test
block file
noblick stream
i am new line
Welcome sed's world
very good defz.cn

# $r插入文件末尾
[root@zyc-vm Documents]# sed '$r rfile.txt' test.txt 
This is an sed test file
Linux test
i am new line
Welcome sed's world
very good defz.cn
block file
noblick stream

多点编辑

一条 sed 命令,删除第3行到末尾的数据,并把 This替换为That:

[root@zyc-vm Documents]# nl test.txt | sed -e '3,$d' -e 's/This/That/'
     1	That is an sed test file
     2	Linux test

移动文本

移动文本指令:

  • H,复制到剪贴板;
  • g、G,将剪贴板中的数据覆盖/追加至指定行;
# 将包含the 的行迁移至文件末尾,{;}用于多个操作
sed '/This/{H;d};$G' test.txt

# 将第 1~5 行内容转移至第 17 行后
sed '1,5{H;d};17G' test.txt 




返回软件开发辅助网 | 常用命令列表

shell语法手册