1. 参考
官方手册:https://www.gnu.org/software/sed/manual/sed.html
查看shell内置sed手册:man sed
2. 简介
sed(stream editor) 是一个流编辑器。 流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。本文介绍sed的常用用法与语法逻辑,进阶用法请参考官方手册。
3. sed命令用法
3.1. sed命令语法
sed OPTIONS... [SCRIPT] [INPUTFILE...]
# OPTIONS 选项
# SCRIPT 执行脚本
# INPUTFILE 输入文件
举例:
# 输出/etc/passwd文件中的第5行到第7行,包含起始行和结束行
sed -n '5,7p' /etc/passwd
3.2. 命令语法理解
sed
也是一种程序设计语言,属于脚本型语言。
OPTIONS
,sed程序的启动参数
。SCRIPT
,sed程序脚本
。可以是表达式,也可以从文件中读取。INPUTFILE
,sed脚本程序要处理的文件
。
4. OPTIONS(sed程序启动参数)简介
选项 | 助记 | 描述 |
---|---|---|
-e script | expression | 指定表达式形式的程序脚本。 |
-f script-file | file | 指定文件形式的程序脚本 。 |
-n | no-output | 不输出处理完的结果行,需在程序中使用p 动作输出。 |
-i [SUFFIX] | in-place | 就地修改。将输出写入临时文件,处理结束后,将临时文件重命名为源文件名。可选参数SUFFIX 为备份文件后缀,缺失则不会创建备份文件。 |
-r | regexp-extended | 同-E ,使用扩展的正则表达式。减少转义字符反斜杠的使用。 |
-E | regexp-extended | 同-r ,使用扩展的正则表达式。减少转义字符反斜杠的使用。 |
-u | unbuffered | 尽可能少地缓冲输入和输出。如果输入来自‘tail -f’之类,可以尽快的看到转换后的输出.。 |
5. SCRIPT(sed程序脚本)语法
SCRIPT
由一系列语句组成,语句之间使用;
作为分隔符,语句的基本结构为:[addr]X[options]
。
[addr]
是一个可选的行地址。可以是单行号、行范围或正则表达式。X
是一个单字母sed动作。只对匹配上的行执行该动作。[options]
是执行X
动作需要的参数。
5.1. addr(匹配行地址)用法
5.1.1. 行号匹配方式
形式 | 举例 | 描述 |
---|---|---|
number | 2 | 匹配第2行。 |
$ | $ | 匹配最后一行。 |
first~step | 4~2 | 匹配第4+2n行,含第4行,到流结束。 |
first,last | 2,8 | 匹配第2行到第8行。包含起始行和结束行。 |
first,+N | 2,+4 | 匹配第2行,及第2行后面的4行。 |
first,~N | 2,~8 | 匹配第2行开始,到第2行后面行号为8的倍数的第一行结束。包含起始行和结束行。 |
举例:
# 输出/etc/passwd文件中的第5行
sed -n '5p' /etc/passwd
# 输出/etc/passwd文件中的最后一行。注意要用单引号,双引号中的$符加后面的字符会被解析为变量
sed -n '$p' /etc/passwd
# 输出/etc/passwd文件中的第2+3n行,含第2行
sed -n '2~3p' /etc/passwd
# 输出/etc/passwd文件中的第5行到第7行,含起始行和结束行
sed -n '5,7p' /etc/passwd
5.1.2. 正则表达式匹配方式
形式 | 举例 | 描述 |
---|---|---|
/regexp/ | /\/root/ | 匹配包含/root的行,起始和结束的/ 符为标志字符,表达式中若包含标志字符,需要使用\ 符号转义。 |
\%regexp% | \%/root% | 匹配包含/root的行,% 为自定义标志字符,可以替换为其他字符;表达式中若包含标志字符,需要使用\ 符号转义。 |
/regexp/I | /root/I | 匹配不区分大小写包含root的行。 |
举例:
# 输出/etc/passwd文件中以bash结尾的行
sed -n '/bash$/p' /etc/passwd
# 输出/etc/passwd文件中以bash结尾的行
sed -n '\%bash$%p' /etc/passwd
# 输出/etc/passwd文件中从第一次匹配bash的行开始,到第一次匹配home的行结束的所有行。
sed -n '/bash/,/home/p' /etc/passwd
5.2. X[options](动作+参数)用法
形式 | 举例 | 描述 |
---|---|---|
p | p | print;输出匹配行 |
a text | a abcdefg | append;在匹配行后追加一行,内容为abcdefg |
c text | c abcdefg | change;将匹配到的行替换为abcdefg |
d | d | delete;删除匹配到的行 |
i text | i abcdefg | insert;在匹配行前插入一行,内容为abcdefg |
s/regexp/replacement/[flags] | s/abcd/ABCD/g | substitution;将匹配行中的所有abcd替换为ABCD |
注:s动作的最后一个可选参数flags,常用的有两种:
- g global 替换匹配行中的所有匹配项,而不是只替换第一个匹配项
- i ignore 进行替换匹配时,不区分大小写
举例:
# 输出/etc/passwd文件中的第5行
sed -n '5p' /etc/passwd
# 在第2行后追加hello行
seq 3 | sed '2a hello'
# 在第2行前插入hello行
seq 3 | sed '2i hello'
# 将第2行到第9行共8行替换hello共一行
seq 10 | sed '2,9c hello'
# 删除第2行
seq 3 | sed '2d'
# 将每行的第一个3替换为5
seq 3 3 100 | sed 's/3/5/'
# 将每行的所有3替换为5
seq 3 3 100 | sed 's/3/5/g'