sed处理命令行输出时追加无前缀空行的问题与解决
sed添加前缀时出现空行的问题分析与解决
问题原因
你用的sed替换规则s/.\{0,60\}/${esc}[35m║ &\n/g有两个核心问题:
- 匹配空内容:
.\{0,60\}允许匹配0个字符的空内容,包括空行本身、行首行尾的空位置。当遇到空行时,替换后会生成║加换行,再加上原空行的换行,就会出现一行带前缀、一行空行的情况。 - 全局匹配溢出:全局替换(
g标记)会把每一处符合0-60字符的片段都替换,包括行尾的空匹配,这会额外生成带前缀的空内容和换行,进一步导致空行出现。
解决方法
方法1:消除空行
如果不需要保留空行,直接过滤掉空行再处理截断和前缀:
esc=$(printf '\033') sudo apt upgrade 2>&1 | sed -e "/^$/d" -e "s/.\{1,60\}/${esc}[35m║ &\n/g" -e "s/\n$//"
/^$/d:直接删除所有空行,从源头避免空行干扰.\{1,60\}:把匹配范围改成1-60个字符,只处理非空内容,避免匹配空字符串s/\n$//:去掉最后一行多余的换行,防止末尾出现空行
方法2:给空行添加前缀
如果需要保留空行并给它加上前缀,先处理空行再处理非空行的截断:
esc=$(printf '\033') sudo apt upgrade 2>&1 | sed -e "s/^$/║ /" -e "s/.\{1,60\}/${esc}[35m║ &\n/g" -e "s/\n$//"
s/^$/║ /:把空行直接替换成带前缀的内容- 后续规则和方法1一致,确保非空行按60字符截断加前缀,最后清理多余换行
内容的提问来源于stack exchange,提问作者level42
相关产品推荐
相关产品推荐

