sed 只用来替换文本?一文掌握 sed 更多用法

在 Linux 系统中,sed 命令是一款强大的文本处理工具,它可以进行文本替换、删除、插入等多种操作。本篇文章将详细介绍 sed 命令的用法。


一、sed 命令概述

sed 是 stream editor 的缩写,是一款流式文本编辑器,它以行为单位处理文本数据。通过 sed 命令,我们可以对文本进行各种操作,例如替换、删除、插入等。sed 命令不仅可以独立使用(操作文件),还可以与其他命令配合使用(通过管道),实现更复杂的文本处理需求。


二、sed 命令基本用法

替换文本

替换文本是 sed 命令最常用的功能之一。使用以下命令可以将指定行中的字符串替换为另一个字符串:

sed 's/原字符串/新字符串/g' file


其中,“s”表示替换,“原字符串”是要被替换的字符串,“新字符串”是替换后的字符串,“g”表示全局替换,即替换所有匹配的字符串。如果不加“g”参数,则只会替换每行中的第一个匹配项。

示例:将文件中的“foo”替换为“bar”:

sed 's/foo/bar/g' file
sed '1 s/foo/bar/g' file   #只对第1行进行替换
sed '1,5 s/foo/bar/g' file #只对第1~5行进行替换
删除文本

使用以下命令可以删除指定行中的字符串:

sed 's/原字符串//g' file


其中,“原字符串”是要被删除的字符串,“g”表示全局删除,不再赘述。

示例:删除文件中的“foo”:

sed 's/foo//g' file


插入文本

使用以下命令可以在指定行插入文本:

sed 'n i 插入的文本' file


其中,“n”表示要插入的行号,如果省略则会在每行插入;“i”表示插入操作,插入文本后,原来的第n行变成了第n+1行,相当于是在第n行前插入,“i”换成“a”可以在第n行后插入;“n i”之间以及“i”和插入的文本之间的空格非必需;“插入的文本”是要插入的文本内容。注意,如果要插入的文本本身包含换行符,需要使用转义符“\”进行转义。

示例:在文件插入一行文本:

sed '5 i foobar' file  #在第5行插入文本
sed '$ i foobar' file  #在最后一行前插入文本
sed 'i foobar' file    #在原每一行插入文本
正则表达式替换

示例:将Windows路径中的“:\”和“\”替换成“/”:

sed 's/:*\\/\//g' file


其中,“:*\\”中的“*”表示匹配前面的冒号0次或多次,双斜线表示对斜线转义。路径中冒号的匹配,更准确的应该是0次或1次,如果使用“:?\\”则需要对疑问号也进行转义,使用“:\?\\”。

与其他命令配合使用

sed 命令可以通过管道接收来自其他命令的输出数据。通过使用管道符号“|”,可以将一个命令的输出作为另一个命令的输入。

示例:找出文件中包含“example”的行,并且将“foo”替换为“bar”后输出:

grep example file|sed 's/foo/bar/g'

三、sed 命令高级用法

使用表达式

前面的 sed 命令都是使用单引号。如果需要在命令中使用表达式,改为双引号即可。

示例:将文件中与变量str1的值匹配的内容替换为变量str2的值:

sed "s/${str1}/${str2}/g" file
sed "${i},${j} s/${str1}/${str2}/" file


删除文件行

使用以下命令可以删除指定行的文本:

sed 'n d' file


其中,“n”表示要删除的行号,“d”表示删除操作,两者之间可以没有空格:

sed '3d' file        #删除文件第3行
sed '1,10d' file     #删除文件前10行
sed '$d' file        #删除文件最后一行
sed '/Detail/d' file #删除文件中包含Detail的行


上述示例中,将单引号换成双引号,行号、文本,都可以使用${变量}的方式:

sed '${i}d' file      #删除文件第i行
sed '${i},${j}d' file #删除文件第i~j行
sed '$d' file         #删除文件最后一行
sed '/${text}/d' file #删除文件中包含变量text的值的行
反向引用

sed 命令能够记住之前匹配的子样式,这被称为反向引用,使用半角括号表示被引用的一个组,括号需要转义。反向引用可以用于替换,也可以用于模式匹配查找内容。

示例:匹配4-5位回文字符:

sed -n '/^\(.\)\(.\).\?\2\1$/p' file


其中,“-n”表示只显示匹配的行,两个斜线“/”及之间的内容表示模式匹配,“^$”分别表示行首和行尾,“\(.\)”表示匹配一个任意字符且放入一个引用组,“.\?”表示中间可以有0~1个字符,“\2\1”分别表示反向引用前面“\(.\)”匹配到的内容,“p”表示打印到标准输出。上述脚本可以输出类似以下内容:

122112321abbaab!ba

四、sed 命令完整用法

授人以渔,命令行执行以下任一命令可以查看 sed 命令的语法说明:​​​​​​​

sed --help
man sed
  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小哭包

创作不易,给作者加个鸡腿吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值