Linux 命令和 Shell 技能
sed:在不打开编辑器的情况下编辑流
sed 横向编辑:整个文本流通过它,经过转换,并且没有编辑器打开。它的声誉来自于 -i,它将单行替换转换为跨数千个文件的批处理操作,并且来自于在没有备份后缀的情况下运行它的管理员的灾难故事。安全工作流程永远不会改变:运行可见替换,确认输出,然后添加带有后缀的 -i 并保留退出代码。
要点
- 提交前预览: sed -n '10,20p' 文件显示行范围,相同的 -n 加 p 组合仅打印与正则表达式或地址匹配的行。
- 替换为符合您的意思的标志:s/old/new/g 表示所有匹配,像 2g 这样的数字表示第二个,-E 表示没有反斜杠转义页面的扩展正则表达式。
- 就地编辑获得后缀,无一例外: sed -i.bak 's/http:/https:/g' 应用程序在每次更改旁边保留同名备份;该后缀挽救的部署比任何编辑器的撤消历史都多。
- 分隔符是免费的:s|/var/www|/srv/app|g(或 s#...#g)可以避免当您的模式充满路径时出现斜杠转义冲突。
- -i 不是原子的:崩溃或错误的正则表达式中批一旦留下了一半重写的文件,因此批量作业针对副本或 git 跟踪的树运行,而不是唯一的副本。
- GNU 和 BSD sed 在 -i 上存在分歧:BSD 需要在脚本之前添加后缀(sed -i '' 在 macOS 上工作,不是 Linux 语法),这是可移植性脚本完全避免 -i 的另一个原因。
- 删除和隔离是诚实的动词:'d' 删除匹配行(sed '/^#/d' 删除注释),带有范围的 -n 隔离一个部分;两者都比巧妙的替换读起来更好。
- 任何过去的单行编辑、文字多行块或状态连接都属于 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 服务器安全和服务器管理服务即可全程覆盖:规范评估、干净实施、全天候监控。