2016-12-16 51 views
1

从我的makefile中,我调用了一个perl脚本,它将返回包含文件路径,文件名,行号和错误消息的消息。我只需要文件路径和文件名。我的脚本将此消息打印到标准输出,以便它自动显示在控制台中。如何从shell中的警告消息中提取子字符串

在我的makefile中,如何获取文件路径和文件名?我愿意使用grep,sed或tee或其中最适合使用的版本。

我的字符串是这样的:

Warning: <filepath>/<filename>: <line number> <some message> 

e.g:

Warning temp/output/dir/report.txt: 545 problem with parsing blah blah blah. 

所以,我将只需要获得 “临时/输出/ DIR/REPORT.TXT” 的一部分。什么是最好的方法来做到这一点?

+1

你为什么认为“在makefile中”有什么区别? Makefile中的命令由shell执行。您可以像在命令行中那样过滤该输出。更好地重述这个问题以删除整个“Makefile”部分。就我个人而言,我会去'perlscript | sed“s @ Warning \([^:] * \):。* @ \ 1 @”' – DevSolar

+0

@chris yo:您可以提供关于 – Inian

回答

3

最简单的方法是使用shell的位置参数和参数扩展。 Viz:

$ set -- $(echo Warning: temp/output/dir/report.txt: 545 problem ...) 
echo $2 
temp/output/dir/report.txt: 
$ echo ${2%:}  # Remove colon at the right 
temp/output/dir/report.txt 

这是完全POSIXy,并不依赖任何bashisms。在你的情况,你可以使用

$ set -- $(script); echo ${2%:} 

或可能

$ set -- $(script 2>&1); echo ${2%:} 

如果提取的消息到stderr,而不是标准输出。所有这些假定消息是第一行。如果这个假设是错误的,grep的'警告:'字符串,它应该工作。

+0

'^'提供的解决方案的反馈,以获得纯粹的'POSIX'方式。甚至不知道这样的风格存在!学习到教训了! – Inian

+0

@Inian感谢您的运动精神,同伴HAL9000 :-) – Jens

+0

虽然有一个确认,'$(script 2>&1)'部分与命令替换权相同吗? – Inian

相关问题