NOC online · 24/7Longview, TX · +1 323 412 0665
KinetikatechServers · Security · Websites
ZH

Linux 命令和 Shell 技能

sed:在不打开编辑器的情况下编辑流

sed 横向编辑:整个文本流通过它,经过转换,并且没有编辑器打开。它的声誉来自于 -i,它将单行替换转换为跨数千个文件的批处理操作,并且来自于在没有备份后缀的情况下运行它的管理员的灾难故事。安全工作流程永远不会改变:运行可见替换,确认输出,然后添加带有后缀的 -i 并保留退出代码。

要点

  1. 提交前预览: sed -n '10,20p' 文件显示行范围,相同的 -n 加 p 组合仅打印与正则表达式或地址匹配的行。
  2. 替换为符合您的意思的标志:s/old/new/g 表示所有匹配,像 2g 这样的数字表示第二个,-E 表示没有反斜杠转义页面的扩展正则表达式。
  3. 就地编辑获得后缀,无一例外: sed -i.bak 's/http:/https:/g' 应用程序在每次更改旁边保留同名备份;该后缀挽救的部署比任何编辑器的撤消历史都多。
  4. 分隔符是免费的:s|/var/www|/srv/app|g(或 s#...#g)可以避免当您的模式充满路径时出现斜杠转义冲突。
  5. -i 不是原子的:崩溃或错误的正则表达式中批一旦留下了一半重写的文件,因此批量作业针对副本或 git 跟踪的树运行,而不是唯一的副本。
  6. GNU 和 BSD sed 在 -i 上存在分歧:BSD 需要在脚本之前添加后缀(sed -i '' 在 macOS 上工作,不是 Linux 语法),这是可移植性脚本完全避免 -i 的另一个原因。
  7. 删除和隔离是诚实的动词:'d' 删除匹配行(sed '/^#/d' 删除注释),带有范围的 -n 隔离一个部分;两者都比巧妙的替换读起来更好。
  8. 任何过去的单行编辑、文字多行块或状态连接都属于 awk 或真实脚本;强迫 sed 做程序员的工作就是难以阅读的俏皮话的诞生。

一线手记

我的第一个不带 .bak 后缀的 sed -i 在下午流量高峰之前命中了生产 nginx 配置。从那时起,每个就地编辑都带有备份后缀,并且我在 -i 甚至接近命令之前读取了试运行输出。

常见问题

如何仅编辑与其他内容匹配的行?

解决它们: sed '/cache/s/true/false/' 仅在缓存行上将 true 翻转为 false,并且像 '/<VirtualHost>/,/<\/VirtualHost>/s/Old/New/g' 范围编辑到块;地址在前,命令在后。

为什么 sed 不匹配 Windows 编辑的文件中的行尾?

这些行以“$”锚点不期望的回车符结尾;首先使用 tr 剥离它们,或者在传入时进行规范化,并且多行内容仍然属于 awk 或 Perl 中的 -0777。

对于简单替换,sed 比 awk 更快吗?

边际且无关紧要;两者都在配置大小的文件上以毫秒为单位完成。根据可读性进行选择,因为同事必须在六个月内整理你的俏皮话。

我可以用 sed 插入整个配置块吗?

是:'a' 追加在后面,'i' 插入在前面,'c' 替换该行,但保持插入的文本简单且用途单一;真实块属于模板文件或正确的配置步骤。

Kinetikatech 如何在linux 命令和 shell 技能方面为您提供帮助

情况就是这样:决定管理员是操作服务器还是对抗服务器的命令和脚本编写习惯:使用每个基本安装中的工具搜索、转换、传输和监督文本和进程。交给我们的Linux 服务器安全和服务器管理服务即可全程覆盖:规范评估、干净实施、全天候监控。

与工程师交谈

服务器问题?网站被黑?网站缓慢?

严重问题 30 分钟内响应 — 每天 24 小时,每周 7 天。

请求紧急支持 support@kinetikatech.com