【问题标题】:parsing multiple values from a file从文件中解析多个值
【发布时间】:2011-03-22 17:52:20
【问题描述】:

我有一个文件,它只有一行(一大行)要解析。我想解析出现在这一行的“未定义的错误代码”和“id”之间的值。问题是这在同一行上多次出现,并且到处都有不同的值。下面的代码只给了我最后一个实例。

cat bad_events_P2J3.xml | sed -n 's/.*Undefined error code (\(.*\))\" id.*/\1\n/p'

我怎样才能得到这个的所有实例?

【问题讨论】:

  • 为什么不替换“id”。用“\n”?然后每条记录都在一行上。

标签: parsing shell sed awk


【解决方案1】:

你是在正确的轨道上:

sed -n 's/.*Undefined error code\(.*\)id.*/\1/p' bad_events_P2J3.xml

请注意,cat 是不必要的,除非您需要额外的换行符,否则sed 将为您提供一个。

我错过了这在您的文件中多次出现的事实。这应该在这种情况下工作:

grep -Po 'Undefined error code.*?id' bad_events_P2J3.xml | sed 's/^Undefined error code//;s/id$//'

【讨论】:

  • 所以是猫引起的问题?我想我应该可以用 sed 来做到这一点。我只是没有只见树木不见森林。谢谢
  • @amadain:不,cat 不是问题所在。这只是没有必要的,因为sed 接受文件名作为参数并且您没有连接多个文件。问题可能是额外的一组括号。没有看到部分实际数据,很难确定。
  • @OP,这只有在你确定你有这对词的 1 个实例时才有效。它只会得到最后一个实例,因为 sed 是贪婪的。
  • 谢谢你。实际上需要双括号,因为多次出现的短语实际上是“未定义的错误代码(code_here)” id="code_here" 所以我匹配的数字的实例在括号中。 grep -Po 是我真正需要的。第一个解决方案与我的问题相同,即它只显示一个实例 - 最后一个实例
【解决方案2】:
$ cat file
text1 text2 Undefined error code text3 text4 id text5 text6 Undefined error code txt7 txt8 id
$ awk -vRS="id" '{gsub(/.*Undefined error code/,"")}1' file
 text3 text4
 txt7 txt8

【讨论】:

  • 太棒了。我在任何地方都找不到如何做到这一点。使用简单的 sed 似乎是一件容易的事情,但当你解决它时会困难得多。这段代码很完美。谢谢
猜你喜欢
  • 2023-03-25
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2020-04-09
相关资源
最近更新 更多