You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU sed 4.7:如何将两条sed命令合并为单条命令?

合并两条sed命令为单条的正确写法

问题背景

现有两条可正常运行的sed命令:

sed -E "s#Example(.*)#\nconst ex='Example\1';\n#; s#Input:(.*)#const\1;#" in.txt | sed '/\S/!d'

尝试合并为单条命令但未成功:

sed -E "s#Example(.*)#\nconst ex='Example\1';\n#; s#Input:(.*)#const\1;#; /\S/!d" in.txt

输入文件in.txt内容:

Example 1:



Input: s = "()"

使用GNU sed 4.7版本,期望输出:

const ex='Example 1:';
const s = "();

失败原因

原尝试的单条命令中,/\S/!d仅对原始输入行进行空行判断,而第一个替换命令插入的\n会生成新的空行,这些新空行属于当前处理行的输出内容,不会被/\S/!d过滤,导致最终输出包含多余空行。

正确单条命令写法

方案一:保留原替换的换行逻辑,全局清理空行

利用GNU sed的多行模式,先将整个文件读入模式空间,再执行替换和空行清理:

sed -E ':a;N;$!ba; s#Example(.*)#\nconst ex='\''Example\1'\'';\n#; s#Input:(.*)#const\1;#; s/\n+/\n/g; s/^\n|\n$//' in.txt

命令解释

  1. :a;N;$!ba:将整个文件内容读入单个模式空间,实现多行统一处理
  2. s#Example(.*)#\nconst ex='Example\1';\n#:完成第一个替换,保留原有的换行插入逻辑
  3. s#Input:(.*)#const\1;#:完成第二个替换
  4. s/\n+/\n/g:将所有连续换行替换为单个换行,清理多余空行
  5. s/^\n|\n$//:删除开头和结尾的换行,确保输出无首尾空行

方案二:简化替换逻辑,直接过滤原始空行

去掉替换中的换行插入,直接用/\S/!d过滤原始空行,写法更简洁:

sed -E "s#Example(.*)#const ex='Example\1';#; s#Input:(.*)#const\1;#; /\S/!d" in.txt

内容的提问来源于stack exchange,提问作者albertkao9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:33:12