运维笔记:流编辑器sed命令用法解析

简介: 运维笔记:流编辑器sed命令用法解析

1. sed命令简介

sed(stream editor)是一个强大的文本处理工具,用于对文本流或文件进行过滤和转换。它主要用于自动编辑一个或多个文件;简化对文件的重复操作;编写转换程序等。其语法格式为:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

其中可选选项([OPTION]部分)包括:

  -n, --quiet, --silent 抑制自动打印模式空间
      --debug           注释程序执行
  -e script, --expression=script      将脚本添加到要执行的命令中
  -f script-file, --file=script-file  将脚本文件的内容添加到要执行的命令中
      --follow-symlinks               处理时跟随符号链接   
  -i[SUFFIX], --in-place[=SUFFIX]     就地编辑文件(如果提供了后缀,则制作备份)
  -l N, --line-length=N    指定 `l' 命令的期望换行长度
      --posix              禁用所有 GNU 扩展
  -E, -r, --regexp-extended 在脚本中使用扩展正则表达式(为便于移植,请使用 POSIX -E)。
  -s, --separate    将文件视为独立的而不是单一的连续长流。
      --sandbox     在沙盒模式下操作(禁用 e/r/w 命令)。
  -u, --unbuffered  从输入文件加载最少量的数据并更频繁地刷新输出缓冲区
  -z, --null-data   以 NUL 字符分隔行
      --help        显示此帮助信息并退出
      --version     输出版本信息并退出

如果没有指定 -e--expression-f--file 选项,则第一个非选项参数将被视为要解释的 sed 脚本。所有剩余的参数都是输入文件的名称;如果没有指定输入文件,则读取标准输入。

2. 实际运用举例

2.1 删除文本中的空白行

sed '/^$/d' file.txt

这个命令会显示 file.txt 中所有非空行,不修改原文件。其中,使用正则表达式^$ 匹配空行,即开始和结束之间没有任何字符的行。d 命令用于删除匹配的行。

2.2 文本替换:将所有出现的 “apple” 替换为 “orange”

sed 's/apple/orange/g' file.txt

这个命令会显示替换后的内容,不修改原文件。其中:

  • s 表示替换操作。
  • apple 是要查找的文本。
  • orange 是替换后的文本。
  • g 表示全局替换,即替换每一行中的所有匹配项。

例如当前目录有一个file.text文件为:

执行该命令后输出结果为:

可见,文档中所有的“apple”都被替换成了“orange”

2.3 在每行的末尾添加文本

sed 's/$/ end of line/' file.txt

这个命令会在每行的末尾添加 " end of line" 文本,它将显示修改后的内容,不会修改原文件。其中:

  • $ 在正则表达式中表示行的末尾。

例如当前目录有一个file.text文件为:

执行该命令后输出结果为:

2.4 打印文件的一些行

sed -n '2,6p' file.txt

这个示例的命令用于显示第 2 行到第 6行的内容。其中:

  • -n 选项与 p 命令一起使用,用于抑制自动打印并只打印指定的行。
  • 2,6 指定了行范围。

例如当前目录有一个file.text文件为:


执行该命令后输出结果为:

这不会修改原文件。

2.5 将文件中的所有数字增加 1

sed 's/[0-9]/&1/g' file.txt

这个命令会在每个数字后面添加 1,如 8 变为 81,显示修改后的内容,不修改原文件。其中:

  • 正则 [0-9] 匹配任何单个数字;
  • & 代表匹配到的整个部分(这里是单个数字);
  • &1 表示在匹配到的数字后添加 1;

例如有一个file.text文件为:

执行该命令后的结果为:

这不会改变原文件的内容。

2.6 注释掉包含特定文本的行

sed '/apple$/s/^/#/' file.txt

这个命令会在所有包含 “pattern” 的行前添加 #,显示修改后的内容打印,不修改原文件。其中:

  • 正则/apple$/ 查找包含以 “apple” 结尾的行。
  • s/^/#/ 将这些行的开始替换为 “#”,即添加注释。

例如有一个file.text文件为:

执行该命令后的结果为:

可见,由于第1行、第3行以“apple”结尾,输出的内容中这两行前面添加了一个“#”号。

2.7 删除文件中的最后一行

sed '$d' file.txt

这个命令会删除 file.txt 的最后一行,显示修改后的内容,不修改原文件。其中:

  • $ 表示文件的最后一行。
  • d 是删除命令。

例如有一个file.text文件为:

执行该命令后的结果为:

2.8 将文件中的第一行移动到最后一行

sed '1h;1d;$G' file.txt

这个命令会将第一行移动到文件的最后,显示修改后的内容,不修改原文件。其中:

  • 1h 表示将第一行复制到暂存缓冲区。
  • 1d 表示删除第一行。
  • $G 表示在文件的最后一行后追加暂存缓冲区的内容。

例如有一个file.text文件为:

执行该命令后的结果为:

3. 就地编辑

之前给出的示例都不会直接修改文件,但是很多时候我们是希望直接修改文件的。就地编辑是 sed 命令的一个非常有用的功能,允许直接修改文件而不是仅仅输出修改后的结果。这通过 -i 选项实现,可以选择性地指定一个后缀来创建原文件的备份。

3.1 就地编辑示例

例如假设有一个名为 example.txt 的文件,内容如下:

Hello, this is a test file.
This file contains some sample text.
We will replace the word 'sample' with 'example'.

执行命令:

sed -i 's/sample/example/g' example.txt

这里:

  • -i:表示“就地编辑”,即直接修改原文件而不是输出到标准输出。
  • s:表示替换操作。
  • g:表示全局替换,即在整个文件中进行替换,而不仅仅是每行的第一个匹配项。

修改后的 example.txt 文件内容将变为:

Hello, this is a test file.
This file contains some example text.
We will replace the word 'example' with 'example'.

可见最后一行的’sample’变成了’example’。

3.2 创建备份并就地编辑

如果你想在修改文件的同时创建一个备份,可以在 -i 选项后添加一个后缀。这个后缀将被用作备份文件的扩展名。

sed -i.bak 's/old_text/new_text/g' file.txt

这个命令不仅会修改 file.txt,还会创建一个名为 file.txt.bak 的备份文件,其中包含原始内容。

继续使用上面的 example.txt 文件:

Hello, this is a test file.
This file contains some sample text.
We will replace the word 'sample' with 'example'.

执行命令:

sed -i.bak 's/example/sample/g' example.txt


这将把文件中的 “example” 替换回 “sample”,并创建一个包含修改前内容的备份文件 example.txt.bak。其中:

-i.bak:表示“就地编辑”,并指定 .bak 作为备份文件的后缀。这意味着在修改原文件之前,sed 会先将原文件 example.txt 复制一份,命名为 example.txt.bak

  • s:表示替换操作。
  • example:这是要被替换的文本模式,即查找文本中所有出现的 “example”。
  • sample:这是替换后的文本,即将找到的 “example” 替换为 “sample”。
  • g:表示全局替换,即在整个文件中进行替换,而不仅仅是每行的第一个匹配项。

修改后的 example.txt 文件内容将变为:

Hello, this is a test file.
This file contains some sample text.
We will replace the word 'sample' with 'sample'.

备份文件 example.txt.bak 的内容为:

Hello, this is a test file.
This file contains some example text.
We will replace the word 'example' with 'example'.

4. 结论与应用

sed 是一个极其强大的流编辑器,它允许我们通过简单的命令行操作来执行复杂的文本处理任务。无论是进行简单的文本替换、删除特定行、还是更复杂的文本操作,sed 都能提供高效且灵活的解决方案。通过上述示例,我们可以看到 sed 在处理各种文本编辑任务时的实用性和便捷性。

自动化处理sed 可以用于脚本中,自动化处理大量文件,减少重复劳动。例如,编写一个Dockerfile时,我们可以使用sed来完成文本就地编辑工作:

RUN sed -i 's/# DBPassword=/DBPassword=zabbix/g' /etc/zabbix/zabbix_server.conf

其中:

  • -i:这个选项告诉 sed 直接修改文件,而不是输出修改后的内容到标准输出。这称为“就地编辑”;
  • 's/# DBPassword=/DBPassword=zabbix/g':这是一个 sed 的替换命令,具体包含以下部分:
  • s:表示进行替换操作。
  • # DBPassword=:这是要被替换的文本模式,即查找以 # DBPassword= 开头的文本。这通常表示该行是被注释的。
  • DBPassword=zabbix:这是替换后的文本,即将找到的文本替换为 DBPassword=zabbix。这个操作实际上是取消注释并设置数据库密码为 zabbix`;
  • g:表示全局替换,即在整个文件中进行替换,而不仅仅是每行的第一个匹配项。
  • /etc/zabbix/zabbix_server.conf:这是要修改的文件路径。
  • 文本分析:可以快速修改或提取文件中的数据,对于日志分析、数据抽取等场景尤为有用。
  • 编程辅助:对源代码进行批量修改,如批量添加注释、修改变量名等。
目录
相关文章
|
2月前
|
人工智能 运维 Kubernetes
别再手动敲命令了!运维自动化才是打工人的“自救之道”
别再手动敲命令了!运维自动化才是打工人的“自救之道”
89 8
|
6月前
|
弹性计算 人工智能 运维
摆脱繁琐命令-让运维更加流畅-阿里云ECS操作系统控制台运维篇
阿里云操作系统控制台提供了便捷的服务器监控与管理功能,简化了运维工作。通过将多台服务器纳入统一监控平台,用户可以快速查看CPU、内存、磁盘和网络等关键资源的使用情况,避免了逐一远程连接查询的繁琐操作。此外,该工具支持自动化数据汇总,极大地方便了日报、周报和月报的编写。测试过程中,系统展示了良好的稳定性和响应速度,尤其在网络抖动和大文件健康状态测试中表现出色。整体体验流畅,显著提升了运维效率。 操作系统控制台地址:[点击访问](https://alinux.console.aliyun.com/)
181 26
摆脱繁琐命令-让运维更加流畅-阿里云ECS操作系统控制台运维篇
|
8月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
273 6
|
8月前
|
运维
阿里云服务器批量执行命令(系统运维管理oos)
阿里云【系统运维管理oos】批量执行详情
181 5
|
10月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
788 3
|
10月前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
702 3
|
6月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
623 29
|
6月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
181 4
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

热门文章

最新文章

推荐镜像

更多
  • DNS