【发布时间】:2011-12-01 17:49:28
【问题描述】:
我在使用 bash/sed 时遇到了一点问题。我需要能够在 sed 表达式中使用命令替换。我有两个大文本文件:
首先是 logfile.txt,其中 sometimes* 按 ID 显示错误消息(0xdeadbeef 是常见示例),格式为 ERRORID:0xdeadbeef
second errors.txt 有成对存储的错误消息 LONG_ERROR_DESCRIPTION, 0xdeadbeef
我尝试使用 sed 和 bash 命令替换来完成任务:
cat logfile.txt | sed "s/ERRORID:\(0x[0-9a-f]*\)/ERROR:$(cat errors.txt |
grep \1 | grep -o '^[A-Z_]*' )/g"
(^^^ 当然应该是一行)
如果它可以工作,那么我可以获得更好的日志文件版本和更好的错误信息。
Lot's of meaningless stuff ERRORID:0xdeadbeef and something else =>
=> Lot's of meaningless stuff ERROR:LONG_ERROR_DESCRIPTION and something else
但事实并非如此。问题是 sed 无法将正则表达式部分(\1)“注入”到命令替换中。我还有哪些其他选择?我知道可以先构建 sed 表达式或以其他方式构建,但我想避免多次解析这些文件(它们可能很大)。
一如既往地非常感谢您的帮助。
*日志文件中没有真正的格式。没有不一致地使用节、列、制表符/逗号分隔
附言。只是为了解释。以下表达式有效,但当然其中没有传递参数:
echo "my cute cat" | sed "s/cat/$(echo dog)/g"
【问题讨论】:
-
errors.txt的设计并不完全有利于机器加工。像0xdeadbeef Long description这样的东西会更容易处理。也许你会想在另一个晴朗的日子从中生成一堆#defines? -
@tripleee - 实际上我有一堆 #define 被 cmets 切得很厉害 - 这是我的真实情况。我试图尽可能地限制这个例子,以免进入细节。重要的是要有类似#define 的设置:TEXT 0xdeadbeef。这就是为什么您的解决方案也需要在我这边进行一些调整的原因。我必须收集所有头文件并从中生成 *.sed 文件。我正在努力,但你的方法尽可能接近可用的东西。
标签: linux bash sed substitution