【问题标题】:SED groups outputSED 组输出
【发布时间】:2015-03-13 15:40:24
【问题描述】:

我正在尝试使用 SED 命令在文件中查找模式。 不知何故,我的正则表达式不起作用,尽管我希望它起作用。

详情: 文本文件 aaa.log 包含以下数据:

007ba20: fa2e1438 fa3e1438 d1af9a57 d0000000  8...8.>.W.......
007ba30: d0006813 d3af9a17 d2000009 d200001d  .h..............
007ba40: d1af9a52 d0004a43 d000505f d3af9b12  R...CJ.._P......
007ba50: d2000009 d20000d3 04100012 04404350  ............PC@.
007ba60: 0440004a 04100001 059a4393 059a0002  J.@......C......
007ba70: 04100005 04100000 04100000 059a4153  ............SA..
007ba80: 059a4154 059a4162 059c40fc 04100012  TA..bA...@......
007ba90: 04404350 0440004a 04100001 059c4392  PC@.J.@......C..
007baa0: 059c40f5 0440a350 0440004a 04404350  .@..P.@.J.@.PC@.
007bab0: 0440004a 04400068 04400000 04100000  J.@.h.@...@.....
007bac0: 04100000 059c410f 059e4193 03a00001  .....A...A......
007bad0: 03a04255 03a04292 03a04294 02400000  UB...B...B....@.
007bae0: 02408009 02100000 03a04215 028005b1  ..@......B......

我的目的是跟踪以 d1 和 d0 开头的所有 8 个字符模式,后跟 6 个任意字符,然后是空格

因此,我形成了以下行:

p=".*(d1.{6}|d0.{6})[[:space:]].*"; cat aaa.log | tr '\r\n' ' ' | sed -rn "s/$p$p$p$p$p$p/\1 \2 \3 \4 \5 \6\n/p"

正如您在 aaa.log 中看到的那样,存在六组 $p。确实找到了输出:

d1af9a57 d0000000 d0006813 d1af9a52 d0004a43 d000505f

但是,当我使用以下语法时,aaa.log 文件中没有第 7 个 $p 模式:

p=".*(d1.{6}|d0.{6})[[:space:]].*"; cat aaa.log | tr '\r\n' ' ' | sed -rn "s/$p$p$p$p$p$p$p/\1 \2 \3 \4 \5 \6 \7\n/p"

它失败并且不打印任何输出。

我假设由于模式 7 不存在而未打印输出。

知道即使找不到某些模式,如何将匹配的组打印为输出吗?

【问题讨论】:

  • sed 不利于跟踪,请改用 grep

标签: regex linux bash sed tr


【解决方案1】:
sed -rn '/ d[01][0-9a-f]{6} / s/\r//p' aaa.log
  • 打印任何您的分组以 d0/d1 开头并后跟 6 个十六进制字符的行

sed -rn '/^[[:xdigit:]]{7}:.*[[:space:]]d[01][[:xdigit:]]{6}[[:space:]].*.{16}$/ s/\r//p' aaa.log

  • 更精确的选择器,但有点重

【讨论】:

  • 忘记变成{-r\{,换个帖子
【解决方案2】:

grep -o "d1[^ ]\{6\}\|d0[^ ]\{6\}" 呢?

【讨论】:

  • 后面可能有一个管道 tr
  • 确实满足了需求,但我想知道如何使用 SED 来做到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2011-02-16
  • 1970-01-01
  • 2016-07-13
  • 2010-10-18
  • 2016-08-27
相关资源
最近更新 更多