如何让sed仅处理每行首个匹配的替换规则后停止?
实现sed的分支式替换(匹配首个规则即停止)
要让sed对每行文本优先匹配最具体的规则,匹配成功后立即停止后续规则的处理,而非链式执行所有替换,核心是利用sed的t命令——该命令会在前一个替换操作成功执行时,跳转到脚本末尾(跳过当前行剩余的所有命令)。
修改后的sed脚本
s/Execution error for request ([0-9]+). Reason: (ESS-[0-9]+) Job logic indicated a system error occurred while executing an asynchronous java job for request ([0-9]+). Job error is.*/\1 \2/p t s/Execution error for request ([0-9]+). Reason: com.jbo.AttrValException: (JBO-[0-9]+): Attribute RequestId is required./\1 \2/p t s/Execution error for request ([0-9]+). .*/\1/p
关键说明
- 每个替换命令后添加
t:一旦当前替换成功,t会触发跳转,直接结束当前行的处理,避免后续规则对已替换内容再次操作。 - 修正原脚本语法错误:第二个替换命令中,捕获组引用需用
\1/\2而非1/2,否则无法正确提取匹配内容;第一个替换规则末尾添加.*,确保匹配整行内容。 - 配合
-n选项:仅在替换成功时通过p命令输出结果,避免空行或原始内容输出。
测试验证
输入文本
Execution error for request 12345678. Reason: com.jbo.AttrValException: JBO-27035: Attribute RequestId is required. Execution error for request 87546213. Reason: ESS-07033 Job logic indicated a system error occurred while executing an asynchronous java job for request 87546213. Job error is: null. Execution error for request 54789632. Reason: null
执行命令
sed -E -n -f filter.sed input.txt
输出结果
12345678 JBO-27035 87546213 ESS-07033 54789632
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

