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
命令解释
:a;N;$!ba:将整个文件内容读入单个模式空间,实现多行统一处理s#Example(.*)#\nconst ex='Example\1';\n#:完成第一个替换,保留原有的换行插入逻辑s#Input:(.*)#const\1;#:完成第二个替换s/\n+/\n/g:将所有连续换行替换为单个换行,清理多余空行s/^\n|\n$//:删除开头和结尾的换行,确保输出无首尾空行
方案二:简化替换逻辑,直接过滤原始空行
去掉替换中的换行插入,直接用/\S/!d过滤原始空行,写法更简洁:
sed -E "s#Example(.*)#const ex='Example\1';#; s#Input:(.*)#const\1;#; /\S/!d" in.txt
内容的提问来源于stack exchange,提问作者albertkao9
相关产品推荐
相关产品推荐

