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

相关推荐

  1. sed 替换文本掌握 sed

    2023-12-08 12:00:04       49 阅读
  2. 【linux】sed

    2023-12-08 12:00:04       34 阅读
  3. Bash变量进行sed替换

    2023-12-08 12:00:04       41 阅读
  4. set的一些和问题

    2023-12-08 12:00:04       48 阅读
  5. C++的std::optional的

    2023-12-08 12:00:04       23 阅读
  6. Set和Map的

    2023-12-08 12:00:04       29 阅读
  7. 分别 grep,sed,awk 实现文本筛选过滤功能

    2023-12-08 12:00:04       68 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 12:00:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 12:00:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 12:00:04       82 阅读
  4. Python语言-面向对象

    2023-12-08 12:00:04       91 阅读

热门阅读

  1. 常见代码优化案例记录

    2023-12-08 12:00:04       40 阅读
  2. SQL 中连接类型大全

    2023-12-08 12:00:04       46 阅读
  3. PHP案例:探究MySQL应用开发喜好的网络调查

    2023-12-08 12:00:04       58 阅读
  4. MySQL 数字函数

    2023-12-08 12:00:04       41 阅读
  5. vuex实现持久化存储

    2023-12-08 12:00:04       70 阅读
  6. Git的相关命令

    2023-12-08 12:00:04       56 阅读
  7. Docker创建mqtt容器mosquitto

    2023-12-08 12:00:04       59 阅读