如何用正则折叠mkfs输出中的退格符与空格序列?
解决mkfs交互式输出日志混乱的正则表达式方案
保存mkfs命令输出到日志文件时,会遇到日志内容混乱的问题——该命令采用交互式进度展示:先打印退格符回退光标,再用空格擦除旧内容,接着再次退格并输出新进度信息,导致日志里充斥无效的控制字符。
目前已实现将连续退格符折叠为单个字符,但需要更优的正则表达式,把「退格符+空格+退格符」这类序列转换为单个空格。
示例输入与期望输出
示例输入
# echo -e "123\x08\x08\x08 \x08\x08\x08456 789"
期望转换结果
123 456 789
mkfs实际输出示例(退格符复制粘贴时已移除)
mke2fs 1.47.0 (5-Feb-2023) fs_types for mke2fs.conf resolution: 'ext4' Discarding device blocks: 0/16463361572864/1646336 done Filesystem label=data_volume OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 412080 inodes, 1646336 blocks 82316 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1686110208 51 block groups 32768 blocks per group, 32768 fragments per group 8080 inodes per group Filesystem UUID: c27f71c7-2d9e-4a33-9d54-449ab3e2f378 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: 0/51 done Writing inode tables: 0/51 done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: 0/51 done
正则表达式解决方案
分步处理正则
- 先合并连续退格符:将多个连续的
\x08(退格符)替换为单个退格符s/\x08+/\x08/g - 再替换「退格+空格+退格」序列:将这类组合替换为单个空格
s/\x08 \x08/ /g
一次性处理复杂组合的正则
如果要覆盖多个退格+多个空格+多个退格的场景,可以用更通用的正则:
s/\x08+\s+\x08+/ /g
实际使用示例(以sed为例)
直接通过sed实时处理mkfs输出并写入日志:
mkfs.ext4 /dev/sdX 2>&1 | sed -e 's/\x08+/\x08/g' -e 's/\x08 \x08/ /g' > mkfs.log
或者用组合正则简化命令:
mkfs.ext4 /dev/sdX 2>&1 | sed -e 's/\x08+\s+\x08+/ /g' > mkfs.log
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

