如何对命令输出执行sed提取操作同时不抑制全部原有输出
可行的两种实现方案
方案1:实时输出全部内容
利用tee把脚本输出复制一份输出到终端,同时不影响匹配提取,适合需要实时看到脚本执行输出的场景:
word123=$(./test.sh | tee /dev/stderr | sed -nr 's/Hello world (.*)/\1/p')
运行后你会直接在终端看到test.sh的全部输出,同时变量word123会被正确赋值为123。原理是tee将收到的所有内容同时写入到指定的/dev/stderr(标准错误流,默认会直接输出到终端,不会被$()的命令替换捕获)和后续的sed管道中。
方案2:先缓存全量输出再处理
兼容性更强,不存在系统对/dev/stderr的权限限制问题,适合不需要实时输出的场景:
# 先将脚本的全部输出存入变量 full_output=$(./test.sh) # 手动输出全部内容 echo "$full_output" # 从缓存的输出中提取匹配内容 word123=$(sed -nr 's/Hello world (.*)/\1/p' <<< "$full_output")
这个方案会等test.sh执行完成后再一次性输出所有内容,变量提取逻辑和你原来的写法完全一致。
内容的提问来源于stack exchange,提问作者jipot
相关产品推荐
相关产品推荐

