如何通过管道传递Rust/cargo输出并使用sed完成文本替换
问题根因
sed没生效是两个问题叠出来的:
- 流不匹配:cargo、rustc的编译报错、帮助提示这类诊断信息,默认往**标准错误(stderr)**流输出,普通管道
|只会转发标准输出(stdout)的内容,sed半行提示文本都接不到,自然没法做替换。 - sed参数误用:你给sed加了
-n参数,这个参数的作用是关闭sed默认打印所有处理行的逻辑,你写的s/help/Help/替换规则后面没加p(打印匹配行)标记,就算内容送到sed手里,处理完也不会输出结果。
你之前试的cargo run 2>&1 sed -n -e 's/help/Help/'还有语法错误:重定向2>&1后面直接写sed,漏了管道符|,shell会把sed当成传给cargo run的命令行参数,根本不会启动sed处理文本。
正确写法
去掉sed多余的-n参数,先把标准错误重定向到标准输出,再通过管道传给sed即可:
cargo run 2>&1 | sed 's/help/Help/'
执行后就能看到提示行的help被替换为Help,和预期输出完全一致。
如果你确实需要使用sed的-n参数,记得在替换规则末尾加p标记,仅打印匹配并替换后的行:
cargo run 2>&1 | sed -n 's/help/Help/p'
内容的提问来源于stack exchange,提问作者TornaxO7
相关产品推荐
相关产品推荐

