当前位置: 首页 > 面试题库 >

sed表达式中的命令替换

皇甫卓君
2023-03-14
问题内容

我对bash / sed没什么问题。我需要能够在sed表达式中使用命令替换。我有两个大文本文件

  • 首先是logfile.txt, 有时*以 错误ID:0xdeadbeef的格式按ID显示错误消息(常见示例为0xdeadbeef)。

  • 第二个error.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无法将regex节(\
1)“注入”到命令替换中。我还有其他选择吗?我知道可以先构建sed表达式或以其他方式构建它,但是我想避免多次解析这些文件(它们可能很大)。

一如既往的感谢您的帮助。

*日志文件中没有实际格式。没有不一致地使用节,列,制表符/逗号分隔

PS。只是为了解释。以下表达式有效,但是当然其中不传递任何参数:

echo "my cute cat" | sed "s/cat/$(echo dog)/g"

问题答案:

您可以从错误消息目录中创建sed脚本,然后将该sed脚本应用于日志文件。

基本上,遵循以下原则:

sed 's/\(.*\), 0x\([0-9A-F]*\)$/s%ERRORID:0x\2%ERROR:\1%g/' errors.txt |
sed -f - logfile.txt

第一个sed脚本的输出应如下所示:

s%ERRORID:0x00000001%ERROR:Out of memory%
s%ERRORID:0x00000002%ERROR:Stack overflow%
s%ERRORID:0x00000031%ERROR:values of beta may cause dom%

也就是说,一个新的sed脚本指定了目录中每个错误代码的替换。

sed的方言不同,因此可能需要稍作调整。我相信Linux上的sed应该在将正则表达式中的括号分组之前使用反斜杠,并乐于接受标准输入作为该-f选项的参数。但是,这不能移植到其他Unices(但如果需要可移植性,可以用Perl代替sed)。

  • 编辑: 如果错误消息是相当静态的,和/或您想从标准输入中读取日志,则将生成的脚本保存在文件中;

    sed ‘s/(.), 0x([0-9A-F])$/s%ERRORID:0x\2%ERROR:\1%g/’ errors.txt >errors.sed

    Use it many times

    sed -f errors.sed logfile.txt

你也可以添加#!/usr/bin/sed -f在顶部errors.sedchmod +x它,使之成为一个独立的命令脚本。



 类似资料:
  • - 轻量级流编辑器,一般用来处理文本类文件 sed 是非交互式的编辑器。它不会修改文件,除非使用 shell 重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上 用 sed -i 会实际写入,下面为了演示,都没加该参数,有需要可以自行添加。 基础例子 有一个文件:/opt/log4j2.properties status = error

  • 我有以下模式的输入 我想用sed将所有逗号“”字符替换为制表符。约束条件是不替换文本字符串中的“”(即'中的逗号不应替换为制表符)。这样做的正则表达式是,(?!,_)。 但是下面的sed不起作用。我也尝试了所有转义排列。 有办法做到这一点吗?

  • 我正在学习SED,我看到了这个SED替换示例。它应该在每一行中将第一个小写t替换为大写: 文件内容: 不过,这并不是世界末日,因为我可以将其输出到一个新文件中: 但是如果我想编辑原始文件,我该怎么办?

  • 问题内容: 我在file.txt中有以下数据: 我想将字符串替换为“-”之后的字符串,最多替换为“;” 只需加上“;”,就可以得到: 我尝试使用以下命令: 但这给了我以下错误: sed命令出现乱码 为什么会这样呢? 问题答案: 这应该工作:

  • 问题内容: 无论如何,您可以像Java正则表达式模式/匹配/组一样使用sed做正则表达式匹配组吗? 如果我有像 我如何使用sed只是为了获得如下结果: 我想知道sed是否允许您执行类似java regex的操作,您定义的模式如下: 然后您可以将结果作为一个数组获得,例如: 问题答案: 您必须对括号进行转义才能对表达式进行分组: 并与使用它们,等等。 编辑 :还请注意,在此之前不匹配。括号内是文字。

  • 我有一个多行匹配的pcregrep命令,我想把它转换成awk或sed命令,因为我需要它在一台没有pcregrep的机器上(OS X)。 原始命令: 它输出包含字符串“baseTX”的接口名称(这是我发现的唯一可靠地找出MacBook上以太网接口名称的方法)。对我来说是“en4”。 输入文本如下所示: 我怎么能用awk或se抓取“en4”?我试了一个小时,但我只是不擅长se和awk。