sed c命令捕获多行内容并去除空行需求及替代方案咨询
解决方案
使用sed实现
你需要在begin和end标记区间内删除空行,同时保留标记本身和非空内容,sed可通过区间定位+条件分支实现:
sed '/^begin$/,/^end$/{ /^begin$/b /^end$/b /^$/d }' file
命令说明:
/^begin$/,/^end$/:定位begin到end的行区间/^begin$/b和/^end$/b:遇到begin或end行时直接输出,不执行后续删除操作/^$/d:删除区间内的空行
使用awk实现(逻辑更直观)
awk处理多行区间的可读性更强,同样能满足需求:
awk '/^begin$/{flag=1; print; next} /^end$/{flag=0; print; next} flag && /./{print}' file
命令说明:
- 匹配到
begin时,开启标记flag=1,打印该行并跳过后续处理 - 匹配到
end时,关闭标记flag=0,打印该行并跳过后续处理 - 当
flag=1(处于区间内)且行非空时,打印该行
关于你的伪代码失效原因
sed的c命令是替换整个匹配区间为指定内容,无法捕获区间内原有内容做二次处理,因此不能用c命令实现“保留区间内非空内容”的需求,必须通过区间内的条件判断筛选行。
内容的提问来源于stack exchange,提问作者nathan rogers
相关产品推荐
相关产品推荐

