linux sed系列 第二篇:sed进阶技巧——地址定位与正则表达式
liuian 2025-07-09 14:13 51 浏览
“上一篇我们掌握了 sed 的基础替换,如同获得了第一把钥匙。现在,让我们更进一步,学习如何精准锁定目标行,如同拥有了导航地图,让每一次操作都直击要害!”
地址定位的四种维度
sed 的强大,很大程度上源于其灵活多变的地址定位能力。它能从四个维度锁定你的目标:
- 行号定位:简单直接,如手术刀般精确。sed '10,20d' file 意味着删除文件的第10到20行。对于结构固定的文件,这无疑是最快捷的方式。
- 正则匹配:模式的狩猎者。sed '/^ERROR/p' app.log 会在 app.log 中搜寻以 "ERROR" 开头的行并打印出来。这是动态文本处理的利器。
- 范围组合:起始与终点的界定。sed '/START/,/END/s/foo/bar/' 会在匹配到 "START" 的行开始,到匹配到 "END" 的行结束的这个范围内,将 "foo" 替换为 "bar"。处理日志块或特定配置节时尤为有效。
- 特殊符号:例如 $ 代表最后一行,1~2 代表从第一行开始,每隔一行匹配一次(奇数行)。
这些维度可以单独使用,也可巧妙组合,编织出复杂的定位逻辑。
AlmaLinux正则增强特性
在AlmaLinux(以及大多数现代Linux发行版)中,sed 的正则表达式能力得到了增强,主要体现在对POSIX扩展正则表达式(ERE)的支持上。
POSIX BRE vs ERE (PCRE-like):默认情况下,sed 使用基础正则表达式(BRE),其中像 ?, +, {}, |, () 等元字符需要转义 (\?, \+, \{\}, \|, \(\))。通过 -r (或 --regexp-extended) 选项,可以启用扩展正则,使得这些元字符无需转义,书写更简洁,可读性更强,更接近Perl兼容正则表达式(PCRE)的风格。
换行符处理与多行合并:sed 默认是逐行处理的,换行符 \n 在模式空间中通常是不可见的。但通过 N 指令,可以将下一行追加到模式空间,此时模式空间中就会包含 \n。例如,sed 'N;s/\\n//' 可以将两行合并为一行。这是实现跨行匹配和替换的关键技巧。
分支跳转实战
sed 不仅仅是简单的查找替换,它还拥有初步的逻辑控制能力——分支与跳转。这让 sed 脚本有了“思考”的能力。看这个例子,我们将日志文件中的错误行升级为CRITICAL级别并打印,其他行则直接删除:
sed '{
/error/{
s/alert/CRITICAL/
p
}
d
}' logfile这里的花括号 {} 将多条指令组合在一起,作用于匹配 /error/ 的行。首先执行替换 s/alert/CRITICAL/,然后打印 p,最后无论是否匹配,所有行都会经过 d 指令(除非被 p 后通过 q 或其他方式提前退出)。这个例子中,匹配的行被处理并打印,然后被 d 删除;不匹配的行直接被 d 删除。因此,只有处理过的错误行会被输出。
保持空间进阶用法
除了模式空间(Pattern Space,当前处理行的缓冲区),sed 还有一个神秘的“后备仓库”——保持空间(Hold Space)。通过 h, H, g, G, x 等指令,我们可以在这两个空间之间巧妙地腾挪数据,实现复杂的多行操作,例如跨行计算。
想象一下,我们要从 /var/log/messages 中提取AlmaLinux系统负载的峰值信息。这通常分布在连续的几行中。我们可以这样做:
sed -n '/Load avg/{h; n; H; x; s/\\n/ /p}' /var/log/messages解析: /Load avg/: 找到包含 "Load avg" 的行。 h: 将该行(模式空间内容)复制到保持空间(覆盖)。 n: 读取下一行到模式空间。 H: 将当前模式空间的内容追加到保持空间。 x: 交换模式空间和保持空间的内容。现在模式空间包含了之前两行的合并内容。 s/\\n/ /p: 将模式空间中的换行符替换为空格,并打印结果。 这只是冰山一角,保持空间的灵活运用是 sed 高阶技巧的试金石。
“精准定位的地图已在手中,正则表达式的利剑也已出鞘。我们甚至窥见了 sed 逻辑控制与数据暂存的曙光。下一篇,我们将正式踏入 sed 的‘编程模式’,探索其流程控制的奥秘,解锁编写复杂 sed 脚本的终极能力!”
相关推荐
-
- 手机app怎么下载(手机app怎么下载安装)
-
每个手机上都有下载APP的应用商店,以下面为例演示,下载方法如下:1、首先在手机上找到并打开应用商店。2、接下来进入到应用商店之后,选择红色箭头所指处的搜索栏,搜索需要下载的应用。3、接下来会弹出搜索的应用,点击红色箭头所...
-
2026-01-13 23:37 liuian
- dell电脑蓝屏开不了机怎么办
-
电脑蓝屏的解决方法,先软件后硬件,一般软件问题比较多一点。1、最后一次正确的配置:在开机启动未进入到操作系统之前我们不停按下F8键,选择“最后一次正确的配置”然后回车即可。2、安全模式:如果“最后一次...
- 如何单独改c盘为mbr模式(如何c盘改为mbr分区 免格式化)
-
硬盘分为两种格式的分区,一种是GPT,一种是MBR,一般win7或者以下系统是安装在MBR分区中,而win8和win10一般是安装在gpt分区中的,这两个分区格...
- win7activation解压密码(windows7解压文件去哪里了)
-
若使用的是vivo手机,忘记vivo账号密码、锁屏密码,可携带手机、身份证、有效的购机凭证前往服务中心处理,进入浏览器搜索vivo官网--服务--服务中心--查看全部--选择省市查询当地的服务中心地址...
- 移动固态硬盘排行榜(移动固态硬盘排行榜前十名)
-
西部数据。西部数据MyPassport随行SSD版。西数最主打的移动固态硬盘,如果在大促期间可以在900元以下的价格买到,搭载了NVMe技术,最大读速1050M/S,这是主流大厂速度在1050M/S...
- windows资源管理器怎么关闭(windows资源管理器关闭后电脑黑屏)
-
1、鼠标放在桌面,右击选中启动任务管理器。2、进入任务管理器之后,点击上方的进程,然后找explorer。3、鼠标右击explorer,选中结束进程。4、接着弹出弹框,确认结束进程,这样Windows...
- win10正版系统官网原版纯净版gho
-
下载Ghost版本的Win10的iso文件然后把这个iso文件解压出来然后使用搜索的方式搜索出.GHO文件就是你需要的win10.gho安装,这是系统的ghost文件,你可以选择制作pe系统u盘...
- 戴尔官方网站查询真伪(戴尔官方正品查询)
-
找到笔记本背面或底部的服务标签或快速服务代码(也可以跳过这步)。打开dell支持网页http://www.dell.com/support/home/cn/zh/cnbsd1?c=cn&l=z...
- 手机无法连接无线网络(手机怎么连无线网络wifi)
-
导致无线网络连接受限的原因主要是由于DNS设置不当、热点本身无法正常访问网络以及防火墙阻止访问网络所造成的。首先需要关闭防护类软件,从而允许无线网络访问外网。在电脑右下角右键点击无线网图标,在弹出菜单...
- 如何格式化(如何格式化C盘)
-
win10电脑格式化操作步骤如下:首先按下键盘的【win】键,然后选择【设置】。然后在设置界面选择【更新和恢复】。接着在弹出的窗口左侧点击【恢复】,然后在右侧的重置此电脑下点击【开始】。再进入重置界面...
- w10专业版激活方法(widows10专业版怎么激活)
-
1、首先,我们先查看一下windows10专业版激活状态:点击桌面左下角的“Windows”按钮,从打开的扩展面板中依次点击“设置”-“更新和安全”,并切换到“激活”选项卡,在此就可以查看到当前系统的...
- win11默认安装路径怎么修改(windows10默认安装路径更改)
-
方法如下:1、首先打开左下角开始菜单。2、接着打开其中的“设置”。3、然后进入“存储”选项。4、随后展开高级存储设置,打开“保存新内容的地方”。5、在其中修改新内容的保存路径。6、修改好之后...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
