如何合并含-n参数的三条sed命令?
合并带-n参数的sed命令解决方案
核心问题是-n参数会抑制sed的默认输出,导致原本依赖默认输出的d命令(删除指定行后输出剩余行)无法和带-n的打印命令兼容。下面提供两种可行的合并方式:
方式1:将-n命令转换为无-n的等价形式
sed -n '/something/,+16p'的作用是仅打印匹配/something/的行及其后续16行,等价于sed '/something/,+16!d'(删除所有不在该范围内的行,剩余行默认输出)。这样三个命令都无需-n,可以直接合并:
sed -e '15,19d' -e '1712,1747d' -e '/something/,+16!d'
sed会按顺序处理每一行:先删除15-19行、1712-1747行,再剔除不在/something/,+16范围内的行,最终输出符合所有条件的内容。
如果你的需求是先提取/something/,+16的行,再删除其中的15-19和1712-1747行(此时行号是提取后的行号,而非原始文件行号),可以调整命令顺序:
sed -e '/something/,+16!d' -e '15,19d' -e '1712,1747d'
方式2:统一使用-n模式,通过分支命令控制输出
如果更习惯用-n参数,可以用b命令(分支到脚本末尾,跳过后续操作)排除不需要的行,仅打印符合条件的内容:
sed -n -e '15,19b' -e '1712,1747b' -e '/something/,+16p'
逻辑说明:
15,19b:15-19行直接跳过,不执行后续打印操作1712,1747b:1712-1747行同样直接跳过/something/,+16p:剩余行中,只有匹配/something/及其后续16行的内容才会被打印
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

