Shell常用命令sed的语法逻辑与常见用法

本文介绍了shell中的流编辑器sed,包括其基本语法、启动参数、脚本语法,重点讲解了行地址匹配(行号和正则表达式)及动作参数的用法,帮助读者掌握sed的常用操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 scriptexpression指定表达式形式的程序脚本。
-f script-filefile指定文件形式的程序脚本 。
-nno-output不输出处理完的结果行,需在程序中使用p动作输出。
-i [SUFFIX]in-place就地修改。将输出写入临时文件,处理结束后,将临时文件重命名为源文件名。可选参数SUFFIX为备份文件后缀,缺失则不会创建备份文件。
-rregexp-extended-E ,使用扩展的正则表达式。减少转义字符反斜杠的使用。
-Eregexp-extended-r ,使用扩展的正则表达式。减少转义字符反斜杠的使用。
-uunbuffered尽可能少地缓冲输入和输出。如果输入来自‘tail -f’之类,可以尽快的看到转换后的输出.。

5. SCRIPT(sed程序脚本)语法

SCRIPT由一系列语句组成,语句之间使用;作为分隔符,语句的基本结构为:[addr]X[options]

  • [addr]是一个可选的行地址。可以是单行号、行范围或正则表达式。
  • X是一个单字母sed动作。只对匹配上的行执行该动作。
  • [options]是执行X动作需要的参数。

5.1. addr(匹配行地址)用法

5.1.1. 行号匹配方式
形式举例描述
number2匹配第2行。
$$匹配最后一行。
first~step4~2匹配第4+2n行,含第4行,到流结束。
first,last2,8匹配第2行到第8行。包含起始行和结束行。
first,+N2,+4匹配第2行,及第2行后面的4行。
first,~N2,~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](动作+参数)用法

形式举例描述
ppprint;输出匹配行
a texta abcdefgappend;在匹配行后追加一行,内容为abcdefg
c textc abcdefgchange;将匹配到的行替换为abcdefg
dddelete;删除匹配到的行
i texti abcdefginsert;在匹配行前插入一行,内容为abcdefg
s/regexp/replacement/[flags]s/abcd/ABCD/gsubstitution;将匹配行中的所有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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值